私は、カーソルを利用した POJO クラスを作成するのが好きです。Cursor-backed POJO クラスには、Cursor を受け取るコンストラクターがあり、次の利点があります。
- 適切なコンテンツ タイプを返す使いやすいゲッター。インデックスを取得してデータベース内のデータのタイプを記憶するよりもはるかに優れています。
- オブジェクト指向プログラミングのあるべき方法と同様に、他のゲッターからの結果を計算するゲッター メソッド
- ゲッターの戻り値は列挙型にすることができます!
これらのいくつかの利点は、いくつかの定型コードの価値があります。ユーザー エンジニアがカーソル列自体にアクセスしていないため、多くのバグが回避されています。CursorAdapter クラスは引き続き使用しますが、bindView メソッドの最初の行は、Cursor から Cursor をサポートする POJO を作成することであり、それ以降のコードは美しいものになります。
以下は実装例です。ユーザー エンジニアが不透明なカーソルを明確に定義されたユーザー オブジェクトに変換するのは簡単です。その時点から、バッキング カーソルが閉じられていない限り、通常の POJO と同じように渡してアクセスできます。SmartUserCursor は、カーソルがアクセスされる前にカーソル位置が記憶され、復元されるようにするために作成した特別なクラスであり、カーソル列のインデックスも格納するため、検索が高速になります。
例:
public class User {
private final SmartUserCursor mCursor;
public User(SmartUserCursor cursor, int position) {
mCursor = new SmartUserCursor(cursor, position);
}
public long getUserId() {
return mCursor.getLong(SmartUserCursor.Columns.userId);
}
public UserType getType() {
return UserType.valueOf(mCursor.getString(SmartUserCursor.Columns.type));
}
public String getFirstName() {
return mCursor.getString(SmartUserCursor.Columns.firstName);
}
public String getLastName() {
return mCursor.getString(SmartUserCursor.Columns.lastName);
}
public final String getFullName() {
return getFirstName() + " " + getLastName();
}
public static User newUserFromAdapter(BaseAdapter adapter, int position) {
return new User((SmartUserCursor)adapter.getItem(position), position);
}
public static User newUserBlocking(Context context, long UserId) {
Cursor cursor = context.getContentResolver().query(
Users.CONTENT_URI_CLIENT,
Users.DEFAULT_USER_PROJECTION,
Users.Columns.USER_ID+"=?",
new String[] {String.valueOf(UserId)},
null
);
if (cursor == null || !cursor.moveToFirst()) {
throw new RuntimeException("No User with id " + UserId + " exists");
}
return new User(new SmartUserCursor(cursor, Users.DEFAULT_USER_PROJECTION), -1);
}
public final void closeBackingCursor() {
mCursor.close();
}
}