モケラ

Tech Sheets

mokelab

ContentProviderのinsertを実装する

最終更新日:2015-07-07

データの保存先となるSQLiteDatabase側の実装ができたので、今度はContentProvider側の実装にとりかかります。まずはinsertから。

ここまでの実装はここにあります。

まずはonCreate()で、先ほど実装したSQLiteDatabase関連のオブジェクトを作成します。

public class TodoProvider extends ContentProvider {
    private TodoDB mTodoDB;
    private TodoDAO mTodoDAO;

    @Override
    public boolean onCreate() {
        mTodoDB = new TodoDB(getContext());
        mTodoDAO = new TodoDAO(mTodoDB);
        return true;
    }
    // 以下省略
}

次にinsert()を実装します。

public class TodoProvider extends ContentProvider {
    // 中略
    @Override
    public Uri insert(Uri uri, ContentValues contentValues) {
        switch (sUriMatcher.match(uri)) {
        case URITYPE_TODO_LIST:
            return insertLocal(uri, contentValues);
        }
        return null;
    }

    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; }

        return Uri.parse("content://" + AUTHORITY + "/users/" + userId + "/todos/" + id);
    }
    // 以下略
}

まず、UriMatcherで振り分けるで紹介したUriMatcherを使ってUriの確認をします。match()は、パターンに一致した時、addURI()の第3引数で指定したint値が返ってくるので、switchで分岐させます。

あとは、先ほど実装したTodoDAOを利用してデータをSQLiteDatabaseに保存します。保存に成功したらそのレコードのUriを作成し、呼び出し元に伝えます。レコードのUriは好きに決めてもよいのですが、REST APIにならって/users/{ユーザーID}/todos/{レコードID}の形にしました。

一覧に戻る