web-dev-qa-db-fra.com

Android Room: Rappel LiveData d'insertion de mise à jour?

J'ai un Simple DAO fonction CRUD incluse

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

}

Pour le select, il est correct de renvoyer le type LiveData.

Dans l'activité, le code est joli pour la sélection 

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

Cependant, lorsque j'essaie d'insérer, de mettre à jour, de supprimer les données. Le code semble un peu moche et crée également un asynctask à chaque fois. 

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

J'ai 2 question à ce sujet:

  1. Puis-je utiliser LiveData pour encapsuler la fonction supprimer, insérer, mettre à jour?
  2. Meilleure façon de maintenir cette classe asynctask pour supprimer, insérer, mettre à jour?

Appréciez vos suggestions et conseils. Je vous remercie.

13
Long Ranger
  1. Puis-je utiliser LiveData pour envelopper les appels Supprimer, Insérer, Mettre à jour?

Non, tu ne peux pas. J'ai écrit une réponse à la question issue . La raison en est que LiveData est utilisé pour notifier les modifications. Insérer, mettre à jour, supprimer ne déclenchera pas de changement. Il renverra les lignes supprimées, l'ID inséré ou les lignes affectées. Même si cela semble horrible, il est logique de ne pas avoir LiveData encapsulé dans vos fichiers. Quoi qu'il en soit, il serait logique d’avoir quelque chose comme Single autour des appels pour que l’opération soit déclenchée et exploitée par une opération RX-Java. 

Si vous souhaitez déclencher ces appels, une requête de sélection indique à votre LiveData onec que vous avez mis à jour, inséré ou supprimé certaines données.

  1. Meilleure façon de maintenir cette classe asynctask pour supprimer, insérer, mettre à jour?

Après avoir examiné votre exemple, il semble que vous utilisiez mal le modèle-modèle View/Model. Vous ne devriez jamais accéder à votre référentiel dans votre vue. Je ne sais pas si vous faites cela parce que ce n'est pas visible dans votre échantillon. Quoi qu’il en soit, après avoir observé votre LiveData et obtenu un résultat, il n’est pas nécessaire d’envelopper la mise à jour des données dans votre viewModel dans une AsyncTask. Cela signifie que vous devriez toujours vous occuper de

a) afficher le référentiel <-> viewmodel <-> et ne pas visualiser le référentiel <-> et visualiser <-> viewmodel

et 

b) n'essayez pas d'utiliser des threads inutiles. Vous observez LiveData sur un thread d'arrière-plan (@WorkerThread) par défaut (s'il n'est pas annoté avec @MainThread) et obtenez la valeur dans le thread ui (@MainThread).

5
Emanuel S

Vous pouvez aussi utiliser l'annotation @Dao dans les classes abstraites, donc:

  1. Créez une classe abstraite @Dao BaseDao à l'aide des méthodes abstraites @Insert insert(entities) et de la méthode concrète insert(entities, callback) qui effectue ce travail déplaisant AsyncTask en appelant abstract @Insert insert(entities) sur onBackground et votre rappel sur onPostExecute.
  2. Faites en sorte que votre FeedEntryDAO soit aussi une extension abstraite BaseDao et un résumé des méthodes @Query.

L'utilisation du résultat à Kotlin est assez jolie:

database.entityDao().insert(entities) { ids ->
    // success
}
0
Allan Veloso