Ich habe eine Android-App, die überprüfen muss, ob bereits ein Datensatz in der Datenbank vorhanden ist. Wenn nicht, verarbeiten Sie einige Dinge und fügen Sie sie schließlich ein. Lesen Sie einfach die Daten aus der Datenbank, wenn die Daten vorhanden sind. Ich verwende eine Unterklasse von SQLiteOpenHelper, um eine wiederbeschreibbare Instanz von SQLiteDatabase zu erstellen und abzurufen, von der ich dachte, dass sie sich automatisch um die Erstellung der Tabelle kümmert, wenn sie noch nicht vorhanden ist (da sich der dazu erforderliche Code in onCreate befindet (... ) Methode).
Wenn die Tabelle jedoch noch NICHT vorhanden ist und die erste Methode, die für das SQLiteDatabase-Objekt ausgeführt wird, ein Aufruf zur Abfrage (...) ist, zeigt mein Logcat den Fehler "I / Database (26434): sqlite return: error code = 1, msg = keine solche Tabelle: appdata ", und tatsächlich wird die appdata-Tabelle nicht erstellt.
Irgendwelche Ideen warum?
Ich suche nach einer Methode, um zu testen, ob die Tabelle vorhanden ist (denn wenn dies nicht der Fall ist, sind die Daten sicherlich nicht darin enthalten, und ich muss sie erst lesen, wenn ich darauf schreibe, wodurch die Tabelle erstellt wird richtig) oder eine Möglichkeit, um sicherzustellen, dass es erstellt wird und nur leer ist, rechtzeitig für diesen ersten Aufruf zur Abfrage (...)
BEARBEITEN
Dies wurde nach den beiden folgenden Antworten gepostet:
Ich glaube, ich habe das Problem gefunden. Ich habe aus irgendeinem Grund entschieden, dass für jede Tabelle ein anderer SQLiteOpenHelper erstellt werden soll, obwohl beide auf dieselbe Datenbankdatei zugreifen. Ich denke, dass das Umgestalten dieses Codes, um nur einen OpenHelper zu verwenden, und das Erstellen beider Tabellen in onCreate möglicherweise besser funktioniert ...
cursor.close();
select * from sqlite_master where UPPER(name) = 'ROUTES'.
Ich weiß nichts über die Android SQLite-API, aber wenn Sie in SQL direkt mit ihr kommunizieren können, können Sie Folgendes tun:
Dadurch wird sichergestellt, dass die Tabelle immer erstellt wird und keine Fehler ausgelöst werden, wenn sie bereits vorhanden ist.
quelle
Obwohl es bereits viele gute Antworten auf diese Frage gibt, habe ich eine andere Lösung gefunden, die ich für einfacher halte. Umgeben Sie Ihre Abfrage mit einem try-Block und dem folgenden Haken:
Es hat bei mir funktioniert!
quelle
e.getMessage().contains("no such table")
ist schlimmer als Ausnahmen für den Kontrollfluss zu verwenden. Beides ist ein schlechter Stil, aber das Parsen von Fehlermeldungen für bestimmten Text ist sogar ein sehr schlechter Stil.Das habe ich getan:
quelle
Ja, es stellte sich heraus, dass die Theorie in meiner Bearbeitung richtig war: Das Problem, das dazu führte, dass die onCreate-Methode nicht ausgeführt wurde, war die Tatsache, dass
SQLiteOpenHelper
Objekte auf Datenbanken verweisen sollten und nicht für jede Tabelle eine eigene haben sollten. Das Packen beider Tabellen in eineSQLiteOpenHelper
löste das Problem.quelle
Sie haben erwähnt, dass Sie eine Klasse erstellt haben,
SQLiteOpenHelper
die dieonCreate
Methode erweitert und implementiert . Stellen Sie sicher, dass Sie alle Ihre Datenbankerfassungsaufrufe mit dieser Klasse ausführen? Sie sollten nurSQLiteDatabase
Objekte über das erhaltenSQLiteOpenHelper#getWritableDatabase
abrufen,getReadableDatabase
andernfalls wird dieonCreate
Methode bei Bedarf nicht aufgerufen. Wenn Sie dies bereits tun, überprüfen Sie, obSQLiteOpenHelper#onUpgrade
stattdessen die Methode aufgerufen wird. Wenn ja, wurde die Versionsnummer der Datenbank zu einem bestimmten Zeitpunkt geändert, aber die Tabelle wurde zu diesem Zeitpunkt nie ordnungsgemäß erstellt.Nebenbei können Sie die Neuerstellung der Datenbank erzwingen, indem Sie sicherstellen, dass alle Verbindungen zu ihr geschlossen sind, und aufrufen
Context#deleteDatabase
und dann das verwendenSQLiteOpenHelper
, um Ihnen ein neues Datenbankobjekt zu geben.quelle
quelle
quelle
no such table exists: error
kommt, weil, sobald Sie eine Datenbank mit einer Tabelle danach erstellen, wenn Sie eine Tabelle in derselben Datenbank erstellen, dieser Fehler auftritt.Um diesen Fehler zu beheben, müssen Sie eine neue Datenbank erstellen und innerhalb der onCreate () -Methode können Sie mehrere Tabellen in derselben Datenbank erstellen.
quelle
Wichtige Bedingung ist, WENN NICHT EXISTIERT , um zu überprüfen, ob die Tabelle bereits vorhanden ist oder nicht in der Datenbank vorhanden ist
mögen...
quelle
Ich habe mich dem gestellt und damit umgegangen, indem ich versucht habe, so einfach zu fangen, dass ich das tue, was ich in der Tabelle will, wenn es nicht existiert, wird es Fehler verursachen, also fange es durch Ausnahmen und erstelle es :)
quelle
..... Toast t = Toast.makeText (Kontext, "try ...", Toast.LENGTH_SHORT); t.show ();
..... .....
quelle