Вот как я вставляю данные в базу данных с помощью библиотеки сохранения состояния комнаты:
Сущность:
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
Объект доступа к данным:
@Dao
public interface UserDao{
@Insert(onConflict = IGNORE)
void insertUser(User user);
//...
}
Можно ли вернуть идентификатор пользователя после завершения вставки в самом вышеуказанном методе без написания отдельного запроса выбора?
android
persistent-storage
android-room
SpiralDev
источник
источник
int
илиlong
вместо этогоvoid
в результате@Insert
операции?aSyncTask
? как вы возвращаете значение из функции репозитория?Ответы:
На основе документации здесь (под фрагментом кода)
Метод, снабженный
@Insert
аннотацией, может возвращать:источник
@Insert
Функция может возвращатьvoid
,long
,long[]
илиList<Long>
. Пожалуйста, попробуйте это.источник
return Single.fromCallable(() -> dbService.YourDao().insert(mObject));
Возвращаемое значение вставки для одной записи будет 1, если ваш оператор успешно.
Если вы хотите вставить список объектов, вы можете использовать:
И выполните его с помощью Rx2:
источник
Получите идентификатор строки с помощью следующего сниплета. Он использует вызываемый объект ExecutorService с Future.
Ссылка: Руководство по обслуживанию Java Executor для получения дополнительной информации о Callable.
источник
В вашем Dao запрос на вставку возвращает,
Long
т.е. вставленный rowId.В вашем классе модели (репозитория): (MVVM)
В вашем классе ModelView: (MVVM) Обработайте LiveData с помощью DisposableSingleObserver.
Ссылка на рабочий источник: https://github.com/SupriyaNaveen/CookingRecipes
источник
После долгой борьбы мне удалось это решить. Вот мое решение с использованием архитектуры MMVM:
Student.kt
StudentDao.kt
StudentRepository.kt
StudentViewModel.kt
Во фрагменте:
Я использовал DataBinding. Вот мой XML:
Я много боролся, чтобы добиться этого с помощью asynctask, поскольку операции вставки и удаления комнаты должны выполняться в отдельном потоке. Наконец-то удалось сделать это с помощью одного типа, наблюдаемого в RxJava.
Вот зависимости Gradle для rxjava:
источник
Согласно документации функции, помеченные @Insert, могут возвращать rowId.
Проблема, с которой я столкнулся, заключается в том, что он возвращает rowId, а не id, и я до сих пор не выяснил, как получить идентификатор с помощью rowId.
К сожалению, я пока не могу комментировать, потому что у меня нет 50 репутации, поэтому я публикую это как ответ.
источник