使用 CursorWrapper
Cursor是个神奇的表数据处理工具,其任务就是封装数据表中的原始字段值。从Cursor获取数据的代码大致如下所示:
String uuidString = cursor.getString( cursor.getColumnIndex(CrimeTable.Cols.UUID));
String title = cursor.getString( cursor.getColumnIndex(CrimeTable.Cols.TITLE));
long date = cursor.getLong( cursor.getColumnIndex(CrimeTable.Cols.DATE));
int isSolved = cursor.getInt( cursor.getColumnIndex(CrimeTable.Cols.SOLVED));
每从Cursor中取出一条crime记录,以上代码都要重复写一次。(这还不包括按照这些字段值创建Crime实例的代码。)
显然,遇到这种情况,我们应考虑到前面说过的代码复用原则。与其机械地编写重复代码,不如创建可复用的专用Cursor子类。
使用CursorWrapper可快速方便地创建Cursor子类。顾名思义,CursorWrapper能够封装一个个Cursor的对象,并允许在其上添加新的有用方法。
1.在数据库包中新建CrimeCursorWrapper类。
创建CrimeCursorWrapper类(CrimeCursorWrapper.java)
public class CrimeCursorWrapper extends CursorWrapper {
public CrimeCursorWrapper(Cursor cursor) {
super(cursor);
}
}
2.可以看到,以上代码创建了一个Cursor封装类。该类继承了Cursor类的全部方法。注意,这样封装的目的就是为了定制新方法,以方便操作内部Cursor。
获取相关字段值的getCrime()方法。
public Crime getCrime() {
String uuidString = getString(getColumnIndex(Cols.UUID));
String title = getString(getColumnIndex(Cols.TITLE));
long date = getLong(getColumnIndex(Cols.DATE));
int isSolved = getInt(getColumnIndex(Cols.SOLVED));
return null;
}
3.我们需要返回具有UUID的Crime。在Crime.java中新增一个有此用途的构造方法。
新增Crime构造方法(Crime.java)
public Crime() {
this(UUID.randomUUID());
mId = UUID.randomUUID();
mDate = new Date();
}
public Crime(UUID id) { mId = id;
mDate = new Date();
}
4.最后,完成getCrime()方法。
新增getCrime()方法(CrimeCursorWrapper.java)
public Crime getCrime() {
String uuidString = getString(getColumnIndex(CrimeTable.Cols.UUID));
String title = getString(getColumnIndex(CrimeTable.Cols.TITLE));
long date = getLong(getColumnIndex(CrimeTable.Cols.DATE));
int isSolved = getInt(getColumnIndex(CrimeTable.Cols.SOLVED));
Crime crime = new Crime(UUID.fromString(uuidString));
crime.setTitle(title);
crime.setDate(new Date(date)); crime.setSolved(isSolved != 0);
return crime;
}
(Android Studio会让你确定是选择java.util.Date还是java.sql.Date。不要搞错,即便我们现在是在编写数据库相关代码,也应该选java.util.Date。)