web-dev-qa-db-ja.com

Android Room - 自動生成で新しく挿入された行のIDを取得します

これが、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を返すことは可能ですか?

84
DeveScie

ドキュメントに基づく ここ (コードスニペットの下)

@Insertアノテーションでアノテーションを付けられたメソッドは以下を返すことができます。

  • 単一挿入操作の場合はlong
  • 複数の挿入操作の場合はlong[]またはLong[]またはList<Long>
  • 挿入されたIDを気にしない場合はvoid
121
MatPag

@Insert関数はvoidlonglong[]またはList<Long>を返すことができます。これを試してください。

 @Insert(onConflict = OnConflictStrategy.REPLACE)
  long insert(User user);

 // Insert multiple items
 @Insert(onConflict = OnConflictStrategy.REPLACE)
  long[] insert(User... user);
14
Quang Nguyen

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.

        }
    });
4
Cuong Vo

次の断片で行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の詳細については。

3
Hardian

あなたの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

1
Supriya Naveen