117 votes

Salle Android @Delete avec paramètres

Je sais que je ne peux pas utiliser DELETE dans une requête (c'est une honte, soit dit en passant), j'obtiendrai l'erreur suivante :

<i>Error:error: Observable query return type (LiveData, Flowable etc) can only be used with SELECT queries that directly or indirectly (via @Relation, for example) access at least one table.</i>

Mais je ne peux pas utiliser @Delete(WHERE... xxx) Alors comment puis-je supprimer une ligne spécifique par un paramètre ?

339voto

Maragues Points 9461

En fait, vous pouvez utiliser @Query pour effectuer une suppression.

@Query("DELETE FROM users WHERE user_id = :userId")
abstract void deleteByUserId(long userId);

Extrait de Javadoc sur les requêtes :

Les requêtes UPDATE ou DELETE peuvent renvoyer void ou int. Si c'est un int, la valeur valeur est le nombre de lignes affectées par cette requête.

2 votes

Ça marche, j'ai utilisé quelque chose comme ça et supprimer tout est également écrit de cette façon. Pour référence, vérifiez ceci : ( stackoverflow.com/a/44249498/2185548 )

1 votes

@Delete ne fonctionne pas pour moi pour une raison quelconque. Mais cela fonctionne !

2 votes

@Rakesh Vous avez peut-être un identifiant primaire autogénéré dans votre entité, ce qui signifie que vous ne pouvez le supprimer qu'en utilisant un paramètre, comme "userId" ici.

90voto

Awais Points 440

La beauté de la pièce, c'est qu'on joue avec les objets. Selon vos besoins, vous pouvez utiliser pour kotlin :

@Delete
fun delete(model: LanguageModel)

pour Java :

@Delete
void delete(LanguageModel model)

il supprimera l'objet exact qui est stocké dans la base de données avec les mêmes valeurs. LanguageModel est ma classe de modèle et cela fonctionne parfaitement.

19 votes

Juste une petite observation : La documentation ne mentionne que la correspondance sur les clés primaires pour @Delete méthodes annotées. Il est un peu difficile de savoir ce qui se passera s'il n'y a pas de définition de clé primaire dans le modèle.

3 votes

S'il s'agissait de "supprimer l'objet exact qui est stocké dans la BD avec les mêmes valeurs", cela ne servirait à rien, car les objets changent dans la BD, et leur suppression ultérieure ne devrait pas m'obliger à connaître leurs données exactes ; je dois seulement connaître la clé primaire.

2 votes

@dbm atleast one primary key is required in an Entity in roomdb

42voto

Vous pouvez utiliser la méthode ci-dessous pour supprimer par ID

@Query("DELETE FROM yourDatabaseTable WHERE id = :id")
void deleteById(int id);

pour supprimer toutes les lignes

@Query("DELETE FROM yourDatabaseTable")
void delete();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X