Ist es möglich, spezifische Fehlerdetails von Android SQLiteConstraintException abzurufen?

8

Ich bekomme den folgenden Fehler für bestimmte Daten, und das Konzept ist klar genug:

%Vor%

Das hilft mir jedoch nicht herauszufinden, welcher spezifische Datensatz den ungültigen FK hat. Anstatt meinen Code zu verdreschen und zu versuchen, jeden Insert mit einer neuen Transaktion zu isolieren, gibt es eine Möglichkeit, die Protokollierung mit nützlichen Details wie der betreffenden Tabelle oder sogar dem FK-Wert, der Probleme verursacht, zu aktivieren (oder zu extrahieren)?

>

Außerdem verwende ich SqlBrite und habe die Debugging-Protokollierung aktiviert (die nur die Vorgänge protokolliert, ich bekomme immer noch keine Informationen über den Fehler)

Aktualisierung: Hier ist das gesamte Logcat über meinem eigenen Code; Im Wesentlichen wird die Ausnahme abgefangen, wenn versucht wird, eine zuvor geöffnete Transaktion (BriteDatabase.Transaction) zu schließen (das BriteDatabase.Transaction-Objekt ist eine neue Ergänzung; ich habe gerade von SqlBrite 0.1.0 auf 0.4.1 migriert).

%Vor%     
ProjectJourneyman 06.11.2015, 20:44
quelle

2 Antworten

3

Lösung 1:

Sie können den Befehl adb shell dumpsys dbinfo -v verwenden, um Informationen zu Datenbanken anzuzeigen.

In meinem Fall habe ich ein kleines Beispiel erstellt, das den gleichen Datensatz zweimal einfügt, wodurch ein SQLiteConstraintException :

erzwungen wird %Vor%

Dies ist die Ausgabe des Befehls adb shell dumpsys dbinfo -v in meinem Nexus 4 (ich bin mir nicht sicher, aber ich denke, dass die Ausgabeinfo zwischen den Geräten unterschiedlich sein kann):

%Vor%

Analysieren der Ausgabe, in der Most recently executed operations: bekomme ich die folgenden Informationen (ein Datensatz erfolgreich eingefügt und ein anderer fehlgeschlagen):

%Vor%

Lösung 2:

Diese Lösung ist etwas knifflig, aber Sie können die android.database.sqlite.SQLiteDebug -Klasse verwenden, um ähnliche Informationen über Java-Code zu erhalten.

Wenn Sie einen Blick auf this sehen Sie, dass diese Klasse als @hide markiert ist, was bedeutet, dass die SQLiteDebug-Klasse von den API-Dokumenten ausgeschlossen ist, aber auf sie kann immer noch über Reflektion zugegriffen werden.

Um die Debug-Informationen für die SQLite-Datenbanken zu drucken, können Sie den folgenden Code verwenden:

%Vor%

Ein einfaches Beispiel zur Veranschaulichung der Lösung:

%Vor%

In diesem Fall verwende ich LogPrinter , um die Debug-Informationen an logcat zu senden, aber Sie können Ihre eigene Printer -Implementierung verwenden.

In meinem Nexus 4 sieht das Logcat so aus (ich bin mir nicht sicher, aber ich denke, dass die Ausgabeinfo zwischen den Geräten unterschiedlich sein kann):

%Vor%

Beim Analysieren der Ausgabe erhalte ich SQLiteConstraintException :

%Vor%

Und in Most recently executed operations: bekomme ich die folgende Information (ein Datensatz wurde erfolgreich eingefügt und ein anderer fehlgeschlagen):

%Vor%

Ich hoffe, es hilft.

    
antonio 13.11.2015 18:27
quelle
3

Sie können diese SQLite-Datei von Ihrem Gerät herunterladen und sie dann in eine SQLite-Browser-App laden. So können Sie jetzt versuchen, dieselbe Transaktion auszuführen und zu sehen, was vor sich geht.

SQLite-Browser:

Hi I'm Frogatto 15.11.2015 17:43
quelle

Tags und Links