Android Комната - лучший способ получить запись для обновления - PullRequest
0 голосов
/ 19 июня 2020

У меня есть приложение, в котором есть процедура завершения сеанса. Я хочу обновить сеанс с указанием даты / времени окончания и, возможно, другой информации при нажатии кнопки «Завершить сеанс». У меня есть dao, репозиторий и ViewModel.

Я подумал, что лучший способ сделать это - получить запись, обновить поля в объекте и сохранить объект обратно в комнату.

Я точно не знаю, как go лучше всего об этом сообщить. Вот код, с которым я работаю:

В Dao:

@Query("SELECT * FROM Session WHERE id=:id")
Single<Session> getSessionById(int id);

В репозитории:

public Single<Session> getSessionById(int sessionId) {
    return sessionDao.getSessionById(sessionId);
}

В ViewModel:

public void endSession () {

    Single<Session> session = sessionRepository.getSessionById(sessionId);
    //????? session.doOnSuccess()

    //get current date/time
    Date date = Calendar.getInstance().getTime();

    //set the end date
    session.setEndTime(date);

    //update the session
    sessionRepository.update(session);
}

Я хотел бы получить любой совет по выбору вариантов. Я начал использовать простой объект, но у меня возникли ошибки, связанные с выполнением запроса в основном потоке, и я хотел избежать этого. Мне не нужен наблюдаемый / текучий объект. Я понимаю, что Asyn c устарел в Android 11. Поэтому я подумал, что Single будет работать.

Любые советы по выбору использования Single или кода будут действительно полезны.

ОБНОВЛЕНИЕ: мне просто нужен простой пример в Java извлечения одной записи из, и основная часть - это функциональность в ViewModel (как выглядит doOnSuccess и, возможно, при ошибке).

1 Ответ

0 голосов
/ 19 июня 2020

Если вы просто хотите обновить, не извлекая всю запись, запись пользовательского запроса - это вариант, который I go с:

@Query("UPDATE table_name SET column_name = :value WHERE id = :id")
fun update(id: Int, value: String): Completable

В репозитории:

fun update(id: Int, value: String): Completable

В ViewModel или UseCase:

update().subscribeOn(...).observeOn(...).subscribe()

Если вы хотите избежать использования Rx Java:

@Query("UPDATE table_name SET column_name = value WHERE id = :id")
fun update(id: Int, value: String): Boolean

И используйте Executors для выполнения транзакций в фоновом потоке.

Executors.newSingleThreadExecutor().execute { 
   repository.update()
}

Если вы хотите выполнить и извлечение, и обновление, вы можете использовать @Update и @Query для извлечения записанных внутри вашей ViewModel или UseCase (интерактор) и pu sh обновления для Room.

Rx Java Один пример:

@Query("SELECT * FROM table_name")
fun getAll(): Single<List<Model>>

Репозиторий:

fun getAll(): Single<List<Model>> = modelDao.getAll()

ViewModel или UseCase:

val statusLiveData = MutableLive<Strig>()

modelRepository.getAll()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({ statusLiveData.value = "Success" }, { statusLiveData.value = "Failed" })
...