SQLite unable to open database file (code 14) auf häufige "SELECT" - Abfrage
Ich habe folgende Klasse "Singleton" zu behandeln SQLite-Verbindung und stellen Sie sicher, dass 1 Instanz-Verbindung für den gesamten Prozess/app:
public class DBController {
private static DBController instance = new DBController();
private static DBHelper dbHelper;
public static DBController getInstance()
{
return instance;
}
public SQLiteDatabase dbOpen(Context context)
{
if(dbHelper == null)
dbHelper = new DBHelper(context);
return dbHelper.getWritableDatabase();
}
}
Und DBHelper-Klasse selbst:
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "database.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
final String position = "CREATE TABLE test (" +
"test TEXT NOT NULL);";
db.execSQL(position);
}
}
Wenn ich Häufig versuchen "WÄHLEN Sie" ein paar Infos aus der Datenbank erhalte ich folgende Fehlermeldung:
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
SQLiteLog: (14) os_unix.c:31278: (24) open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal) -
SQLiteLog: (14) statement aborts at 29: [SELECT * FROM test WHERE test='testdata1'] unable to open database file
SQLiteQuery: exception: unable to open database file (code 14); query: SELECT * FROM test WHERE test='testdata1'
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)
Ich verwende folgenden code zum ausführen der Abfrage:
public String getData(Context context)
{
SQLiteDatabase _db = dbOpen(context);
Cursor c = _db.rawQuery("SELECT * FROM test WHERE test='testdata1'", null);
return getDataFromCursor(c).get(0); //gets data from cursor and returns first one
}
Wie kann ich verwalten/verbessern meine Datenbank-connection zu überwinden/vermeiden Sie dieses problem?
Wo leiten Sie die Datenbank Pfad? Sie können sehen, dass es etwas falsch in diesem Pfad:
Danke für die Antwort, ich denke, das problem ist nicht im Zusammenhang mit Datenbank-Pfad... da Meine app funktioniert und alles ist fein, bis es um die Ausführung von getData () - Häufig/Häufig (alle 2 Sekunden)...
Ich denke, man kann es nicht öffnen-Datenbank-Datei, weil es bereits geöffnet ist, von einer anderen Instanz/thread? korrigieren Sie mich, wenn ich falsch bin
Das ist nicht eine gute Idee.
open(/data/user/0/uz.mycompany.myapp/databases/database.db-journal)
. Es sollte so etwas wie /data/data/uz.mycompany.myapp/databases/database.db
Danke für die Antwort, ich denke, das problem ist nicht im Zusammenhang mit Datenbank-Pfad... da Meine app funktioniert und alles ist fein, bis es um die Ausführung von getData () - Häufig/Häufig (alle 2 Sekunden)...
unable to open database file
sagt Euch das was?Ich denke, man kann es nicht öffnen-Datenbank-Datei, weil es bereits geöffnet ist, von einer anderen Instanz/thread? korrigieren Sie mich, wenn ich falsch bin
Das ist nicht eine gute Idee.
open, use, close
.
InformationsquelleAutor JavaMachine | 2016-01-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
vor dem ausführen einer Abfrage, um diese Sachen (sollten Sie öffnen Sie Ihre Datenbank). Schließen Sie die db nach Fertigstellung der Aufgabe.
//Dann schreiben Sie Ihre Abfrage jetzt.... und dann schließen Sie die db.
Können Sie check out my git link1 git link2
Oder ich kann die Kraft, zu warten, bis die Datenbank verfügbar sein wird, zu öffnen (die mit Ihrer Lösung)... aber wird es sein, effiziente in Bezug auf die user experience?
schließen Sie die db nach Fertigstellung der Aufgabe...
Dieser code ist nicht wirklich in der Nähe der DB.
InformationsquelleAutor Md. Shahadat Sarker
Als Ergänzung, ich glaube, dass zu viele Cursor, und somit offen ist, kann auch in die gleiche "unable to open database file error". (in den folgenden code, es gibt 507 Zeilen in der
shoplistcursor
werden, so dass über 1500 Cursor verwendet/weiterverwendet insgesamt)War ich immer die gleiche Meldung. Als pro :-
Den code, dass war im Irrtum war :-
Die Heilung wurde um das schließen der Cursor bei jeder iteration. Als pro :-
InformationsquelleAutor MikeT
Ihren code erneut öffnet sich die Datenbank jedes mal
dbOpen()
genannt wird.Einer SQLite-Datenbank-Objekt ist ganz leicht; es macht nicht wirklich Sinn, halten Sie schließen und erneut öffnen.
Du bereits deine singleton; speichern nur eine einzige
SQLiteDatabase
Bezug gibt.if(writableDB == null) writableDB = dbHelper.getWritableDatabase(); return writableDB;
imdbOpen()
Aber es scheint, die App ist immer noch versuchen zu öffnen, geöffnete Datenbank... ich glaube, ich muss untersuchen, auf dieser...Sie bekommen einen stack-trace, wenn das öffnen fehlschlägt. Entweder, man geht nicht durch den singleton ist, oder das singleton wurde zuvor gelöscht.
InformationsquelleAutor CL.
Bin ich mit dem cursor für eine große Abfrage, wo sich der cursor trifft die DB mehr als 1350 Zeiten von drei separaten 'QUERY' innerhalb von 800 Millisekunden. Also ich habe den Fehler (android.Datenbank.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14)). Ich löste es durch das schließen der cursor vor dem start in eine neue Abfrage. Das behebt mein problem. Hoffe, es wird die Arbeit der mehr große Abfrage als meine.
InformationsquelleAutor Sankha Pattanayak