Ist es in Ordnung, sich auf eine SQLiteConstraint zu verlassen und SQLite die Überprüfung für mich durchführen zu lassen? Gibt es einen Haken?

8

Ich habe eine SQLite-Datenbank in Android und verwende ein ContentProvider , um die Operationen zu behandeln, die in einer Tabelle mit einem UNIQUE-Qualifikationsmerkmal in einer Spalte gespeichert werden.

Problem:

Wenn ich insert Werte in die Datenbank dupliziere, bricht es zwar nicht meinen Code per se, aber es spuckt immer noch tausende von SQLiteConstraintException Log-Zeilen aus, und für meinen Benutzer fühlt es sich an, das Log zu verschmutzen, etwas ungeschliffenes. Ich habe versucht, die Ausnahme zu fangen, nur um zu experimentieren, aber es protokolliert immer noch.

Frage:

Also, wie stille ich diese Protokollzeilen? Ist das überhaupt möglich?

Bitte lesen Sie den folgenden Kommentar für den Grund, um die Frage zu stellen.

Fehler:

Zeitspalte hat die Einschränkung UNIQUE :

%Vor%     
davidcesarino 31.12.2011, 21:35
quelle

3 Antworten

10

Wenn Sie das SQL selbst formulieren oder ändern können, entweder für INSERT oder für das initiale CREATE TABLE , können Sie SQLites Konfliktbehandlung verwenden Erweiterungen . Es gibt zwei Möglichkeiten, dies zu tun:

  • Verwenden Sie beim Einfügen INSERT OR IGNORE und nicht nur INSERT . Sie können auch OR REPLACE , OR ABORT oder eine von mehreren anderen Reaktionen verwenden.
  • Wenn Sie die Tabelle erstellen, geben Sie eine ON CONFLICT IGNORE -Klausel für die Einschränkung UNIQUE an. Das führt dazu, dass bei Einfügungen oder Aktualisierungen, die gegen die Einschränkung verstoßen, nichts stillgelegt wird.

Ich finde die Idee, INSERT OR IGNORE / INSERT OR REPLACE zu verwenden, um doppelte Daten, besonders in gleichzeitigen Umgebungen, sehr sauber zu behandeln. Einmal in der Datenbank wird auf Duplizierung geprüft und Race Conditions vermieden, bei denen zuerst nach dem Vorhandensein gesucht wird (zugegebenermaßen kein Problem, wenn nur ein Prozess / Thread auf die Datenbank zugreift).

Wenn die Duplikate jedoch auf einen Fehler zurückzuführen sind (anstatt doppelte Ereignisse / Aktionen zu duplizieren, bei denen der Code nicht explizit dekompiliert wird), könnte dies den Fehler einfach verbergen, anstatt ihn zu beheben. Der Mangel an expliziter Dedulication ist meiner Meinung nach kein Fehler. Wenn die Fehlerbehebung nach Duplikaten suchen soll, verwenden Sie die Datenbank. Wenn das eigentliche Problem darin besteht, dass sie überhaupt generiert wurden (auf der Ebene der tatsächlichen Anwendung, nicht auf der Ebene der Datenbankzeile), würde ich wahrscheinlich nach diesem Problem suchen.

    
Michael Ekstrand 31.12.2011, 21:39
quelle
4

Verwenden Sie SQLiteDatabase.insertOrThrow(...)

    
micogeek 03.10.2012 20:19
quelle
1

Ja, Sie können es verlassen und wie Sie sagen, könnten Sie es beheben. Meiner Meinung nach kommt es darauf an, ob es sich bei den Dupps um außergewöhnliche Ereignisse handelt oder "einfach passiert, weil du faul bist".

Ich denke, dass es im Allgemeinen weniger kostet, die Daten beim Eintritt in ein Modul zu bereinigen, als später damit umzugehen. Wie Sie die Kosten definieren, hängt jedoch von Ihnen ab.

    
Preet Sangha 31.12.2011 21:40
quelle