Android Room: LiveData обратный вызов обновления вставки?

у меня есть простой DAO включая функцию CRUD

FeedEntryDAO.java

@Dao
public interface FeedEntryDAO {

  @Query("SELECT * FROM feedEntrys")
  LiveData<List<FeedEntry>> getAll();

  @Query("SELECT * FROM feedEntrys WHERE uid = :uid LIMIT 1")
  LiveData<FeedEntry> findByUid(int uid);

  @Insert
  void insertAll(FeedEntry... feedEntries);

  @Delete
  void delete(FeedEntry feedEntry);

  @Update
  int update(FeedEntry feedEntry);

}

на select , это нормально, чтобы вернуть тип LiveData.

внутри активности код довольно для выбора

viewModel.getFeedEntrys().observe(this,entries -> {...});

однако, когда я пытаюсь вставить, обновить , удалить данные. Код кажется немного уродливым, а также каждый раз создает asynctask.

new AsyncTask<FeedEntry, Void, Void>() {
                @Override
                protected Void doInBackground(FeedEntry... feedEntries) {
                  viewModel.update(feedEntries[0]);
                  return null;
                }
}.execute(feedEntry);

у меня есть 2 вопроса о это:

  1. могу ли я использовать LiveData для обертывания функции удаления, вставки , обновления ?
  2. лучший способ поддерживать такой класс asynctask для удаления, вставки, обновления?

благодарен за любые предложения и советы. Спасибо.

1 ответов


  1. можно ли использовать LiveData для переноса вызовов Delete, Insert, Update?

Нет, ты не можешь. Я написал ответ на вопрос. Причина в том, что LiveData используется для уведомления об изменениях. Вставка, обновление, удаление не вызовет изменений. Он вернет удаленные строки, вставленный идентификатор или затронутые строки. Даже если это выглядит ужасно, имеет смысл не иметь LiveData, обернутого вокруг ваших вещей. В любом случае, было бы разумно иметь что-то как один вокруг вызовов, чтобы позволить операции срабатывает и работает на операции RX-Java.

если вы хотите вызвать эти вызовы, вы наблюдаете на запросе выбора, который уведомляет ваш LiveData onec вы обновили, вставили или удалили некоторые/любые данные.

  1. лучший способ поддерживать такой класс asynctask для удаления, вставки, обновления?

посмотрев на ваш пример, похоже, что вы злоупотребляете (Model/View/)ViewModel-Шаблон. Вы никогда не должны получать доступ к репозиторию в своем представлении. Я не уверен, что вы делаете это, потому что его не видно в вашем образце. В любом случае, после наблюдения за LiveData и получения результата нет необходимости обертывать обновление данных внутри viewModel в AsyncTask. Это означает, что вы должны всегда заботиться о

a) view viewmodel репозиторий, а не view репозиторий и view viewmodel

и

b) не пытайтесь использовать потоки, которые не нужны. Вы наблюдаете LiveData в фоновом потоке (@WorkerThread) по умолчанию (если он не аннотирован @MainThread) и получаете значение в ui-thread (@MainThread).