Android Room - получить идентификатор новой вставленной строки с автогенератором

Вот как я вставляю данные в базу данных с помощью библиотеки сохранения пространства:

Entity:

@Entity
class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    //...
}

Объект доступа к данным:

@Dao
public interface UserDao{
    @Insert(onConflict = IGNORE)
    void insertUser(User user);
    //...
}

Возможно ли вернуть идентификатор пользователя после того, как вставка будет завершена в указанном выше методе, не написав отдельный запрос выбора?

Ответы

Ответ 1

На основе документации здесь (ниже фрагмента кода)

Метод, аннотированный аннотацией @Insert может вернуть:

  • long для одной операции вставки
  • long[] или Long[] или List<Long> для нескольких операций вставки
  • void если вас не интересуют вставленные идентификаторы

Ответ 2

Функция

@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);

Ответ 3

Возвращаемое значение вставки для одной записи будет 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

В вашем Dao запрос вставки возвращает Long, т.е. вставленный rowId.

 @Insert(onConflict = OnConflictStrategy.REPLACE)
 fun insert(recipes: CookingRecipes): Long

В вашем классе Model (Repository): (MVVM)

fun addRecipesData(cookingRecipes: CookingRecipes): Single<Long>? {
        return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
}

В вашем классе ModelView: (MVVM) Обрабатывайте LiveData с помощью DisposableSingleObserver.
Рабочая ссылка на источник: https://github.com/SupriyaNaveen/CookingRecipes

Ответ 5

Получите идентификатор строки с помощью следующего фрагмента. Он использует вызываемый на ExecutorService с Future.

 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.