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:
Appréciez vos suggestions et conseils. Je vous remercie.
- 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.
- 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).
Vous pouvez aussi utiliser l'annotation @Dao dans les classes abstraites, donc:
@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
.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
}