CriminalIntent项目的迭代
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CriminalIntent项目的迭代相关的知识,希望对你有一定的参考价值。
SQLite数据库
SQLite是类似于mysql和Postgresql的开源关系型数据库。不同于其他数据库的是,SQLite使用单个文件存储数据,使用SQLite库读取数据。
android标准库包含SQLite库以及配套的一些Java辅助类。
创建数据库前,首先要清楚存储什么样的数据。CriminalIntent应用要保存的是一条条crime记录,这需要定义如图所示的 crimes 数据表。
定义 CrimeTable 内部类(CrimeDbSchema.java)
public class CrimeDbSchema { public static final class CrimeTable { public static final String NAME = "crimes"; } }
CrimeTable 内部类唯一的用途就是定义描述数据表元素的 String 常量。首先要定义的是数据库表名(CrimeTable.NAME)。
接下来定义数据表字段
定义数据表字段(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"; }
创建初始数据库
定 义 完 数 据 库 schema , 就 可 以 创 建 数 据 库 了 。 openOrCreateDatabase(...) 和databaseList() 方法是Android提供的 Context 底层方法,
可以用来打开数据库文件并将其转换为 SQLiteDatabase 实例。
创建 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) { } }
打开 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<>(); }
onCreate(SQLiteDatabase) 方法负责创建初始数据库;
onUpgrade(SQLiteDatabase, int, int) 方法负责与升级相关的工作。
编写SQL创建初始代码(CrimeBaseHelper.java)
public void onCreate(SQLiteDatabase db) { db.execSQL("create table " + CrimeDbSchema.CrimeTable.NAME); }
创建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 + ")" );
写入数据库
负责处理数据库写入和更新操作的辅助类是 ContentValues 。它是个键值存储类,类似于
Java的 HashMap 和前面用过的 Bundle 。不同的是, ContentValues 只能用于处理SQLite数据。
创建 ContentValues (CrimeLab.java)
private static ContentValues getContentValues(Crime crime) { ContentValues values = new ContentValues(); values.put(CrimeTable.Cols.UUID, crime.getId().toString()); values.put(CrimeTable.Cols.TITLE, crime.getTitle()); values.put(CrimeTable.Cols.DATE, crime.getDate().getTime()); values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0); return values; }
插入记录(CrimeLab.java)
public void addCrime(Crime c) { ContentValues values = getContentValues(c); mDatabase.insert(CrimeTable.NAME, null, values); }
insert(String, String, ContentValues) 方法有两个重要的参数,
传入的第一个参数是数据库表名,最后一个是要写入的数据。
更新记录(CrimeLab.java)
public void updateCrime(Crime crime) { String uuidString = crime.getId().toString(); ContentValues values = getContentValues(crime); mDatabase.update(CrimeTable.NAME, values, CrimeTable.Cols.UUID + " = ?", new String[] { uuidString }); }
update(String, ContentValues, String, String[]) 更新方法类似于 insert(...) 方法,向其传入要更新的数据表名和为表记录准备的 ContentValues 。
然而,与 insert(...) 方法不同的是,你要确定该更新哪些记录。
具体的做法是:创建 where 子句(第三个参数),然后指定 where 子句中的参数值( String[] 数组参数)。
Crime 数据刷新(CrimeFragment.java)
@Override public void onPause() { super.onPause(); CrimeLab.get(getActivity()) .updateCrime(mCrime); }
隐式intent
应用运行前,我们无法获知具体陋习细节。因此,必须使用带有占位符(可在应用运行时替换)的格式化字符串。
下面是将要使用的格式化字符串:
<string name="crime_report">%1$s! The crime was discovered on %2$s. %3$s, and %4$s
%1$s 、 %2$s 等特殊字符串即为占位符,它们接受字符串参数。在代码中,我们将调用
getString(...) 方法,并传入格式化字符串资源ID以及另外四个字符串参数(与要替换的占位符顺序一致)。
添加字符串资源(strings.xml)
<string name="crime_report">%1$s! The crime was discovered on %2$s. %3$s, and %4$s </string> <string name="crime_report_solved">The case is solved</string> <string name="crime_report_unsolved">The case is not solved</string> <string name="crime_report_no_suspect">there is no suspect.</string> <string name="crime_report_suspect">the suspect is %s.</string> <string name="crime_report_subject">CriminalIntent Crime Report</string> <string name="send_report">Send crime report via</string>
隐式 intent 的组成
(1) 要执行的操作
通常以 Intent 类中的常量来表示。例如,要访问查看某个URL,可以使用 Intent.ACTION_
VIEW ;要发送邮件,可以使用 Intent.ACTION_SEND 。
(2) 要访问数据的位置
这可能是设备以外的资源,如某个网页的URL,也可能是指向某个文件的URI,或者是指向
ContentProvider 中某条记录的某个内容URI(content URI)。
发送消息(CrimeFragment.java)
mReportButton = (Button) v.findViewById(R.id.crime_report); mReportButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i = new Intent(Intent.ACTION_SEND); i.setType("text/plain"); i.putExtra(Intent.EXTRA_TEXT, getCrimeReport()); i.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.crime_report_subject)); startActivity(i); } });
以上是关于CriminalIntent项目的迭代的主要内容,如果未能解决你的问题,请参考以下文章