これが、Room Persistence Libraryを使ってデータベースにデータを挿入する方法です。
エンティティ:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
データアクセスオブジェクト
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
上記のメソッド自体で挿入が完了したら、別の選択クエリを記述せずにUserのIDを返すことは可能ですか?
ドキュメントに基づく ここ (コードスニペットの下)
@Insert
アノテーションでアノテーションを付けられたメソッドは以下を返すことができます。
- 単一挿入操作の場合は
long
- 複数の挿入操作の場合は
long[]
またはLong[]
またはList<Long>
- 挿入されたIDを気にしない場合は
void
@Insert
関数はvoid
、long
、long[]
またはList<Long>
を返すことができます。これを試してください。
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
// Insert multiple items
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insert(User... user);
1つのレコードに対する挿入の戻り値は、ステートメントが正常に終了した場合は1になります。
オブジェクトのリストを挿入したい場合は、次のようにします。
@Insert(onConflict = OnConflictStrategy.REPLACE)
public long[] addAll(List<Object> list);
そしてRx2でそれを実行します。
Observable.fromCallable(new Callable<Object>() {
@Override
public Object call() throws Exception {
return yourDao.addAll(list<Object>);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() {
@Override
public void accept(@NonNull Object o) throws Exception {
// the o will be Long[].size => numbers of inserted records.
}
});
次の断片で行IDを取得してください。それはFutureでExecutorServiceでcallableを使います。
private UserDao userDao;
private ExecutorService executorService;
public long insertUploadStatus(User user) {
Callable<Long> insertCallable = () -> userDao.insert(user);
long rowId = 0;
Future<Long> future = executorService.submit(insertCallable);
try {
rowId = future.get();
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return rowId;
}
参照: Java Executor Service Tutorial Callableの詳細については。
あなたのDaoでは、query insertはLongを返します、すなわちrowIdが挿入されました。
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(recipes: CookingRecipes): Long
モデル(リポジトリ)クラスでは、(MVVM)
fun addRecipesData(cookingRecipes: CookingRecipes): Single<Long>? {
return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
}
ModelViewクラスで、(MVVM)LiveDataをDisposableSingleObserverで処理します。
実用的なソース参照: https://github.com/SupriyaNaveen/CookingRecipes