Android Room @Delete mit Parametern

75

Ich weiß, dass ich nicht DELETEin einer Abfrage verwenden kann (das ist übrigens eine Schande), ich werde den folgenden Fehler erhalten:

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

Aber ich kann nicht verwenden. @Delete(WHERE... xxx) Wie lösche ich eine bestimmte Zeile durch einen Parameter?

Jack
quelle

Antworten:

65

Das Schöne am Raum ist, wir spielen mit den Objekten. Je nach Anforderung können Sie für Kotlin verwenden:

@Delete
fun delete(model: LanguageModel)

für Java:

@Delete
void delete(LanguageModel model)

Es wird das genaue Objekt gelöscht, das in der Datenbank mit denselben Werten gespeichert ist. LanguageModel ist meine Modellklasse und funktioniert perfekt.

Awais
quelle
15
Nur eine kleine Bemerkung: In der Dokumentation wird nur die Übereinstimmung von Primärschlüsseln für @Deletekommentierte Methoden erwähnt. Es ist etwas unklar, was passieren wird, wenn das Modell keine Primärschlüsseldefinition enthält.
DBM
Wenn es "das genaue Objekt löschen würde, das in der Datenbank mit denselben Werten gespeichert ist", wäre es nutzlos, da sich Objekte in der Datenbank ändern und das spätere Löschen nicht erfordern sollte, dass ich ihre genauen Daten kenne. Ich muss nur den Primärschlüssel kennen.
Alaa M.
227

Tatsächlich können Sie damit @Queryeinen Löschvorgang durchführen.

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

Aus Query javadoc extrahiert :

UPDATE- oder DELETE-Abfragen können void oder int zurückgeben. Wenn es sich um ein int handelt, ist der Wert die Anzahl der Zeilen, die von dieser Abfrage betroffen sind.

Maragues
quelle
2
Das funktioniert, ich habe so etwas benutzt und alles zu löschen ist auch so geschrieben. Als Referenz überprüfen Sie dies: ( stackoverflow.com/a/44249498/2185548 )
Gama der Große
@ Delete funktioniert aus irgendeinem Grund nicht für mich. Aber das funktioniert!
Rakesh
2
@Rakesh Möglicherweise haben Sie eine automatisch generierte primäre ID in Ihrer Entität. Dies bedeutet, dass Sie nur einen Parameter wie "userId" hier löschen können.
Ajith Memana
Zwei Fragen, da ich eine automatisch generierte primäre ID habe, die bedeutet, dass ich auch für meine Aktualisierungsmethoden eine ID verwenden muss, und was ist der Unterschied zwischen delete(normal) und deletebei idAbfragen?
George Udosen
9

Sie können die folgende Methode verwenden, um nach ID zu löschen

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

zum Löschen aller Zeilen

@Query("DELETE FROM yourDB")
void delete();
Faxriddin Abdullayev
quelle