モケラ

Tech Sheets

mokelab

更新通知を実装する

最終更新日: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ができました。次回、これを利用する側の実装を紹介します。

一覧に戻る