2017-09-17 1 views
2

Ich habe eine SQLite-Datenbank und ich bin das Einfügen neuer Datensätze mit dieser Abfrage:SQLite INSERT OR REPLACE mit Bedingung

INSERT OR REPLACE INTO tags (id, name, color, type, deleted, dirty) VALUES (?, ?, ?, ?, ?, 0) 

Id ist PRIMARY KEY

Wenn ich einen neuen Rekord (id doesn bin Einfügen 't existiert in der Tabelle) INSERT ausgeführt werden und alles ist in Ordnung. Wenn die id bereits vorhanden ist, tritt die REPLACE ein und der Datensatz wird ersetzt. Ich sollte eine Bedingung zur Abfrage REPLACE hinzufügen: der Datensatz sollte ersetzt werden, wenn und nur wenn dirty in dem Datensatz, der bereits in der Tabelle vorhanden ist, auf 1 festgelegt wird. Wie kann ich eine solche Bedingung zur Abfrage hinzufügen?

+0

Sie suchen nach UPSERT suchen, die leider nicht SQLite directlty unterstützt. Sie können separate Updates und Einfügungen durchführen. Hier finden Sie einige Problemumgehungen: https://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace –

+0

Warum versuchen Sie, dies mit einer einzigen Anweisung zu tun? –

+0

Ich möchte Rennbedingungen vermeiden. Könnten Sie mir bitte eine Version mit mehreren Abfragen zeigen? –

Antwort

2

Das ist was ich benutze.

Zuerst das Update mit Ihrem Zustand versucht dann, wenn nicht aktualisiert, Führen Sie den Einsatz ...

prüft ein Beispiel unten. Aufruf upsertCategory

/* 
* Update a category 
*/ 
public long updateCategory(Category category) { 

    ContentValues values = new ContentValues(); 
    values.put(COL_CATEGORYDESCRIPTION, category.getDescription()); 
    values.put(COL_CATEGORYSTATUS, category.getStatus()); 
    values.put(COL_CATEGORYCREATEDAT, category.getCreatedAt().getDate()); 
    values.put(COL_CATEGORYUPDATEDAT, category.getUpdatedAt().getDate()); 

    long id = db.update(TABLE_CATEGORIES, values, KEY_ID + "=" + category.getId(), null); 

    return id; 
} 


/* 
* Update or Insert a category 
*/ 
public long upsertCategory(Category category) { 

    // update row 
    long id = updateCategory(category); 

    // 0 rows affected 
    if (id == 0) { 
     // insert row 
     id = insertCategory(category); 
    } 

    return id; 
}