Android Room @Delete mit Parametern

Lesezeit: 4 Minuten

Benutzer-Avatar
Jack

Ich weiß, dass ich es nicht verwenden kann DELETE bei einer Abfrage (das ist übrigens schade) erhalte ich folgenden Fehler:

<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 also eine bestimmte Zeile nach einem Parameter?

Benutzer-Avatar
Maragues

Eigentlich können Sie verwenden @Query um eine Löschung durchzuführen.

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

Herausgefiltert aus javadoc abfragen:

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

  • das funktioniert, ich habe so etwas verwendet und alles löschen wird auch so geschrieben. Als Referenz überprüfen Sie dies: (stackoverflow.com/a/44249498/2185548)

    – Gama der Große

    10. April 2018 um 6:36 Uhr


  • @Delete funktioniert bei mir aus irgendeinem Grund nicht. Aber das funktioniert!

    – Rakesch

    31. Mai 2018 um 11:47 Uhr

  • @Rakesh Möglicherweise haben Sie eine automatisch generierte primäre ID in Ihrer Entität, was bedeutet, dass Sie nur löschen können, wenn Sie einen Parameter wie “userId” hier verwenden.

    – Ajith MA

    16. Oktober 2018 um 9:25 Uhr

  • Zwei Fragen, da ich eine automatisch generierte primäre ID habe, bedeutet das, dass ich auch für meine Update-Methoden eine ID verwenden muss, und was ist der Unterschied zwischen delete(normal) und delete mit id fragen?

    – Georg Udosen

    14. Februar 2019 um 15:08 Uhr

  • Danke für die Informationen @Maragues. die “UPDATE- oder DELETE-Abfragen können void oder int zurückgeben. Wenn es sich um eine Ganzzahl handelt, ist der Wert die Anzahl der Zeilen, die von dieser Abfrage betroffen sind.” Zeug ist das, wonach ich gesucht habe. bei mir hat es funktioniert.

    – Fernando Pérez

    26. August 2021 um 13:05 Uhr


Das Schöne am Raum ist, dass wir mit den Objekten spielen. 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 genau das Objekt gelöscht, das in der Datenbank mit denselben Werten gespeichert ist. LanguageModel ist meine Modellklasse und es funktioniert perfekt.

  • Nur eine kleine Beobachtung: Die Dokumentation erwähnt nur die Übereinstimmung mit Primärschlüsseln für @Delete kommentierte Methoden. Es ist etwas unklar, was passieren wird, wenn es im Modell keine Primärschlüsseldefinition gibt.

    – dbm

    27. Mai 2018 um 18:15 Uhr


  • Wenn es “genau das 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.

    24. Juli 2020 um 8:58 Uhr

  • @dbm mindestens ein Primärschlüssel ist in einer Entität in roomdb erforderlich

    – AndroidLearner

    19. Januar 2021 um 12:38 Uhr

  • @AndroidLearner das ist eigentlich ein gültiger Punkt. Verknüpfung zur Dokumentation für zukünftige Besucher: developer.android.com/training/data-storage/room/defining-data

    – dbm

    21. Januar 2021 um 10:14 Uhr

  • Das ist nicht das Schöne, das ist mühsam, wenn Sie die zu löschende ID kennen, aber nicht das gesamte Objekt abrufen möchten

    – Zaitmann

    6. April um 6:37

Benutzer-Avatar
Fachriddin Abdullaev

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

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

für alle Zeilen löschen

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

  • Hi! Ist es mit der zweiten Methode zum Löschen der Datenbank möglich, einen Wert (wahr oder falsch) zurückzugeben, ob die Löschung erfolgreich durchgeführt wurde, oder eine Notiz? Vielen Dank!

    – Markus Delphi

    28. August 2021 um 21:57 Uhr

  • @MarkDelphi Wenn delete Operation erfolgreich war, würde sie die Anzahl der gelöschten Zeilen zurückgeben. Also eine Rücksendung -1 impliziert, dass der Vorgang fehlgeschlagen ist.

    – Sourav Kannantha B

    9. November 2021 um 17:05 Uhr

Die ROOM-Datenbank bietet eine einfache Möglichkeit zum EINFÜGEN, AKTUALISIEREN und LÖSCHEN eines Objekts in der Datenbank. Um diese Operation auszuführen, musste nur @Delete kommentiert werden. Das Die DELETE-Operation gibt den Int zurück Wenn das Löschen des einzelnen Objekts erfolgreich ist, wird 1 zurückgegeben, andernfalls wird 0 zurückgegeben, wenn die DELETE-Operation nicht erfolgreich ist. Das Hinzufügen des Rückgabetyps ist eine bewährte Vorgehensweise.

KotlinEG.kt

   @Dao
   interface EntityLocalDAO {
       @Delete
       fun deleteData(entityObject: EntityObject) : Int
   }

javaEG.java

   @Dao
   interface EntityLocalDAO {
       @Delete
       int deleteData(EntityObject entityObject);
   }

Sie können jetzt löschen, indem Sie nur Teildaten verwenden.

Pro die Dokumentation:

@Entity
data class Playlist (
    @PrimaryKey
    val playlistId: Long,
    val ownerId: Long,
    val name: String,
    @ColumnInfo(defaultValue = "normal")
    val category: String
)

data class OwnerIdAndCategory (
    val ownerId: Long,
    val category: String
)

@Dao
public interface PlaylistDao {
    @Delete(entity = Playlist::class)
    fun deleteByOwnerIdAndCategory(varargs idCategory: OwnerIdAndCategory)
}

In diesem Beispiel sehen Sie, dass sie die Playlist nur mit der OwnerId und der Kategorie löschen. Sie müssen nicht einmal den Primärschlüssel (playlistId) verwenden.

Der Schlüssel ist, die Annotation @Delete(entity = Playlist::class) zu verwenden.

1311860cookie-checkAndroid Room @Delete mit Parametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy