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.