使用 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。)

posted @ 2017-10-15 17:37  南极刺客  阅读(312)  评论(0)    收藏  举报