J'utilise room framework dans mon projet Android Studio. J'essaie de créer une transaction dans une interface. J'ai lu la documentation d'ici : https://developer.android.com/reference/androidx/room/Transaction
Je sais que nous devrions créer des transactions dans des classes abstraites plutôt que dans des interfaces. Je me demande simplement si cela est possible puisque j'ai déjà plus d'une douzaine d'interfaces dans mon projet et que je ne veux pas les réécrire sous forme de classes abstraites.
Ce que vous essayez de faire n'est pas possible dans une interface car vous ne pouvez pas utiliser une méthode avec un corps dans une interface.
Plus précisément, vous essayez d'exécuter plusieurs instructions (une UPDATE, puis une DELETE), mais une seule instruction peut être exécutée en même temps.
Vos options sont de définir un déclencheur (mis à jour si la ligne de poids peut être déterminée à partir du déclencheur) ou probablement plus probablement d'utiliser une classe abstraite et donc d'utiliser une fonction pour exécuter plusieurs instructions ou d'utiliser des méthodes exploitées (passer/ou récupérer)SupportSQliteDatabase (utiliser des classes abstraites est plus simple).
Ensuite, pour profiter des transactions, vous auriez un @Query factice avant la fonction. Par exemple
Supplémentaire
Il s'agit d'une démo fonctionnelle, conçue pour être exécutée une seule fois, elle utilise les trois méthodes.
D'abord
@Entities
, basé sur ce qui est disponible dans le code, mais en utilisant déjà long pour représenter la date (au lieu d'utiliser un convertisseur de type).Visite
Poids
@Dao
Classe abstraite annotée avec des méthodes abstraites normales et des méthodes avec des corps (Solution 1). La méthode insert permet d'insérer des données (une seule ligne).Maintenant,
@Database
les classes annotées (utilisant des singletons) sont un peu plus compliquées.Ceci a un rappel pour ajouter le déclencheur, le déclencheur est trop complexe car non seulement il supprime après la mise à jour (sans rien supprimer) mais ajoute également une nouvelle ligne dans la table d'accès montrant que le TRIGGER est réellement déclenché (solution 2) .
De plus, pour de meilleures raisons (ou non selon le style/pratique), incluez une fonction pour obtenir et utiliser la SupportSQLiteDatabase (solution 3)
Pour utiliser réellement certains des codes d'activité ci-dessusMainActivity
Résultats de la démonstration via SppInspection
Comme prévu le tableau des poids est vide :-
Comme prévu, il y a 4 lignes dans la table d'accès :-
Enfin, le schéma (c'est-à-dire sqlite_master) montre que le déclencheur existe (il a fallu ajouter 3 lignes supplémentaires) :-