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}の形にしました。