Wie schließe ich den Cursor und die Datenbank sicher?
Hab ich holte die Datensätze aus der Datenbank mit dem Cursor. Es ist die Arbeit perfekt. Aber ich habe schon einige Fehler im Logcat während ich mit diesem code
public Cursor fetchAll()
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior);
return cursor;
}
Mein logcat ist -
12-16 14:49:20.774: E/Database(18611): close() was never explicitly called on database '/data/data/com.android.application/databases/appZ.db'
12-16 14:49:20.774: E/Database(18611): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
12-16 14:49:20.774: E/Database(18611): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
12-16 14:49:20.774: E/Database(18611): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
12-16 14:49:20.774: E/Database(18611): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.DBHelper.fetchAll(DBHelper.java:91)
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.sc_adapter(ApplicationActivity.java:1210)
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.refresh_data(ApplicationActivity.java:1195)
12-16 14:49:20.774: E/Database(18611): at com.android.todoapplication.ApplicationActivity.onKeyDown(ApplicationActivity.java:1440)
12-16 14:49:20.774: E/Database(18611): at android.view.KeyEvent.dispatch(KeyEvent.java:1037)
12-16 14:49:20.774: E/Database(18611): at android.app.Activity.dispatchKeyEvent(Activity.java:2068)
12-16 14:49:20.774: E/Database(18611): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1643)
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2471)
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2441)
12-16 14:49:20.774: E/Database(18611): at android.view.ViewRoot.handleMessage(ViewRoot.java:1735)
12-16 14:49:20.774: E/Database(18611): at android.os.Handler.dispatchMessage(Handler.java:99)
12-16 14:49:20.774: E/Database(18611): at android.os.Looper.loop(Looper.java:123)
12-16 14:49:20.774: E/Database(18611): at android.app.ActivityThread.main(ActivityThread.java:4627)
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invokeNative(Native Method)
12-16 14:49:20.774: E/Database(18611): at java.lang.reflect.Method.invoke(Method.java:521)
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-16 14:49:20.774: E/Database(18611): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-16 14:49:20.774: E/Database(18611): at dalvik.system.NativeStart.main(Native Method)
Ich refered etwas von hier. Sie sagten, dass Sie verwenden getReadableDatabase(). Ich bin mit dieser Methode auch. Und, ich habe diese Methode auch verwenden,
public Cursor fetchAll()
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(t1, new String[] {"_id",name, date, prior, time, dateformat}, null, null, null, null, prior);
if (cursor!=null)
{
cursor.close();
}
if (db!=null)
{
db.close();
}
return cursor;
}
nach, dass der Fehler wie -
Database wasn't open.
Nach, auch ich habe diesen Fehler in meiner Datenbank. So mir jemand sagen Wie ich Sie erwerben die Sicherheit, schließen Sie die Cursor-und die Datenbank nach dem abrufen der Datensätze.
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT:, Wenn man wieder einen cursor, der bereits geschlossen ist, können Sie es nicht verwenden. Öffnen Sie die Datenbank vor dem Aufruf der Methode, und schließen Sie dann den cursor und dann die Datenbank nach dem Aufruf der Methode.
Schließen Sie den cursor, nachdem Sie fertig sind mit es wie folgt:
Oder wenn Sie mit dem cursor von einer Aktivität, und müssen requery (wenn die Aktivität neu gestartet wird, gestoppt...), können Sie dieses verwenden:
Zur Datenbank schließen (nach dem schließen des Cursors, oder wenn innerhalb einer Aktivität in
onDestroy()
vorzugsweise):In Ihrer Klasse erstreckt sich die ContentProvider, wenn Sie die Datenbankverbindung öffnen
und Einstellung der Helfer als eine Instanzvariable in onCreate, können Sie es schließen
Datenbank connection in shutdown.
Bessere Praxis wäre, öffnen Sie es in onResume() und schließen es in onPause().
jedes mal, wenn Sie diese Methode aufrufen, wird die Datenbank öffnen im lese-Modus, aber Sie nicht schließen Sie die Datenbank, die ist, warum diese Fehlermeldung bekommen. öffnen Sie nur einmal, wie von onCreate () - Methode auf und schließen Sie in der destroy()
während Sie können schließen Sie den cursor nach dem abrufen der Zeilen und wenn es keine Notwendigkeit mehr für cursor schließen und auf null setzen
Können Sie auch beziehen sich auf diese Antwort (schlägt vor, wo Sie schließen sollten Cursor/db-Objekte-verbindungen abhängig vom Zustand der Aktivität) oder diese eine (schlägt, wie nahe SQLiteDatabase-Objekt). Keine Notwendigkeit zu erarbeiten, wenn es schon einmal geschrieben. Trotzdem, unter-die Idee für die Codierung Teil.
Versuchen vorbei SQLiteDatabase als parameter die fetchAll-Methode: