更新通知を実装する
最終更新日:2015-07-07
ContentProviderのquery()で返却するCursorオブジェクトには、更新通知を受け取る機能を追加することができます(というか追加しないとまずいらしい)。ここでは、その更新通知機能を実装してみます。
ここまでの実装はここにあります。
まずはquery()で返すCursorオブジェクトに、通知機能をつけます。通知を受け取れるようにするには、CursorオブジェクトのsetNotificationUri()を呼びます。
public class TodoProvider extends ContentProvider {
// 中略
private Cursor queryTodoList(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// Uri = content://com.mokelab.todo.provider/users/{userId}/todos
// pathSegments[0] = users
// pathSegments[1] = {userId}
// pathSegments[2] = todos
String userId = uri.getPathSegments().get(1);
Cursor cursor = mTodoDAO.query(userId, projection, selection, selectionArgs, sortOrder);
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
}
第2引数で、「どのUriに対し通知があったら、更新されたと判断するか」を指定します。ここでは、引数のUriが「このユーザーのTodoぜんぶ」を表しているので、そのままsetNotificationUri()に渡しています。
次に、データの追加後に通知する部分を実装します。
public class TodoProvider extends ContentProvider {
// 中略
private Uri insertLocal(Uri uri, ContentValues contentValues) {
// Uri = content://com.mokelab.todo.provider/users/{userId}/todos
// pathSegments[0] = users
// pathSegments[1] = {userId}
// pathSegments[2] = todos
String userId = uri.getPathSegments().get(1);
String todo = contentValues.getAsString(TodoColumns.TODO);
long id = mTodoDAO.insert(userId, "", System.currentTimeMillis(), 0, todo);
if (id == -1) { return null; }
// notify update
Uri notifyUri = Uri.parse("content://" + AUTHORITY + "/users/" + userId + "/todos");
getContext().getContentResolver().notifyChange(notifyUri, null);
return Uri.parse("content://" + AUTHORITY + "/users/" + userId + "/todos/" + id);
}
}
通知をするには、ContentResolverのnotifyChange()を呼びます。第1引数には「どのUriに対して更新があったか」を指定します。
データの更新と削除は実装していませんが、最低限の操作ができるContentProviderができました。次回、これを利用する側の実装を紹介します。