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
:
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:
INSERT OR IGNORE
und nicht nur INSERT
. Sie können auch OR REPLACE
, OR ABORT
oder eine von mehreren anderen Reaktionen verwenden. 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.
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.
Tags und Links android sqlite exception-handling insert constraints