Criminallntent项目的迭代

Criminallntent项目的迭代

一.Fragment间的数据传递

传递crime的日期给Fragment,需新建一个newInstance(Date)方法,然后将Date作为argument附件给Fragment。为了返回新的日期给Fragment并更新模型层以及对应的视图,需要将日期打包为extra并附加到Intent上,然后调用Fragment.onActivityResult(...)的方法,并传入准备好的Intent参数。

1.添加newInstance()方法(CrimeFragment.java)

@Override
   public View onCreateView(LayoutInflater inflater,ViewGroup container,
                            Bundle savedInstanceState) {
       //加载布局
       View v=inflater.inflate(R.layout.fragment_main,container,false);
       //生成并使用组件
       mDateButton=(Button)v.findViewById(R.id.crime_data);
       mDateButton.setText(mCrime.getDate().toString());
       //mDateButton.setEnabled(false);
       mDateButton.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               FragmentManager manager=getFragmentManager();

               //newInstance替换构造方法
               //DatePickerFragment dialog=new DatePickerFragment();
               DatePickerFragment dialog=DatePickerFragment.newInstance(mCrime.getDate());

               //设置目标fragment
               dialog.setTargetFragment(MainFragment.this,REQUEST_DATE);

               dialog.show(manager,DIALOG_DATE); //显示DialogFragment
           }
       });
       return v;

   }

2.传递数据给DatePickerFragment

直接获取保存在arguments中的数据,并将数据显示,最后设置目标fragment。

package com.example.mytest;

import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class DatePickerFragment extends DialogFragment{
    private static final String ARG_DATE="date";
    public static final String EXTRA_DATE= "com.example.mytest.date";

    private DatePicker mDatePicker;



    //便于被调用传递数据给DatePickerFragment
    //保存日期到argument bundle中,便于DatePickerFragment直接获取
    public static DatePickerFragment newInstance(Date date){

        Bundle args=new Bundle();
        args.putSerializable(ARG_DATE,date);

        DatePickerFragment fragment=new DatePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        //获取Date对象并初始化DatePicker
        Date date=(Date)getArguments().getSerializable(ARG_DATE);

        Calendar calendar=Calendar.getInstance();
        calendar.setTime(date);
        int year=calendar.get(Calendar.YEAR);
        int month=calendar.get(Calendar.MONTH);
        int day=calendar.get(Calendar.DAY_OF_MONTH);

        //添加DatePicker
        View v=LayoutInflater.from(getActivity())
                .inflate(R.layout.dialog_date,null);

        mDatePicker=(DatePicker)v.findViewById(R.id.dialog_date_picker);
        mDatePicker.init(year,month,day,null);

        return new AlertDialog.Builder(getActivity())
                .setView(v)
                .setTitle(R.string.date_picker_title)
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                int year=mDatePicker.getYear();
                                int month=mDatePicker.getMonth();
                                int day=mDatePicker.getDayOfMonth();
                                Date date=new GregorianCalendar(year,month,day).getTime();
                                sendResult(Activity.RESULT_OK,date);
                            }
                        })
                .create();
    }

    //回调目标fragment
    private void sendResult(int resultCode,Date date){
        if (getTargetFragment()==null){
            return;
        }
        Intent intent=new Intent();
        intent.putExtra(EXTRA_DATE,date);

        getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent);
    }
}

3.托管MainFragment,使界面呈现出来。(MainActivity.java)

package com.example.mytest;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentManager fm=getSupportFragmentManager();
        Fragment fragment=fm.findFragmentById(R.id.fragment_container);

        if (fragment==null){
            fragment=new MainFragment();
            fm.beginTransaction()
                    .add(R.id.fragment_container,fragment)
                    .commit();
        }
    }
}

二.SQlite数据库

SQLite是类似于MySQL和Postgresql的开源关系型数据库。不同于其他数据库的是,SQLite使用单个文件存储数据,使用SQLite库读取数据。
Android标准库包含SQLite库以及配套的一些Java辅助类。

1.定义 CrimeTable 内部类(CrimeDbSchema.java)

public class CrimeDbSchema {
public static final class CrimeTable {
public static final String NAME = "crimes";
}
}

2.定义数据表字段(CrimeDbSchema.java)

public static final class Cols {
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
}

3.创建 CrimeBaseHelper 类(CrimeBaseHelper.java)

public class CrimeBaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String DATABASE_NAME = "crimeBase.db";
    public CrimeBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

4.打开 SQLiteDatabase (CrimeLab.java)

public class CrimeLab {
    private static CrimeLab sCrimeLab;
    private List<Crime> mCrimes;
    private Context mContext;
    private SQLiteDatabase mDatabase;
    ...
    private CrimeLab(Context context) {
    mContext = context.getApplicationContext();
    mDatabase = new CrimeBaseHelper(mContext)
    .getWritableDatabase();
    mCrimes = new ArrayList<>();
}

5.创建crime表(CrimeBaseHelper.java)

db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED +
")"
);

6.写入数据库的语法

创建一个数据表

CREATE TABLE table_name(
   column1 datatype,
   column2 datatype,
   column3 datatype,
   .....
   columnN datatype,
   PRIMARY KEY( one or more columns )
);

创建一个索引

CREATE UNIQUE INDEX index_name
ON table_name ( column1, column2,...columnN);

插入一条记录

INSERT INTO tablename VALUES(?,?,?)
SELECT * FROM tablename;

更改一条记录

UPDATE tablename SET column1='newname';
SELECT * FROM Teachers;

根据字段删除一条记录

DELETE FROM tablename WHERE id='1';
SELECT * FROM tablename;
posted @ 2017-10-15 17:27  小北醒醒丶  阅读(378)  评论(0编辑  收藏  举报