Wie schließe ich den Cursor und die Datenbank sicher?

Ich habe die Datensätze aus der Datenbank mit Cursor geholt. Es ist vollkommen perfekt. Aber ich habe einige Fehler in Logcat, während ich diesen Code verwende

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 –

  • Android mit Firebase Analytics zusammen mit Google Analytics
  • Android Kalenderansicht
  • Gibt es irgendwelche guten ORMs (vorzugsweise JPA-Implementierungen), die SQLite (auf Android) unterstützen?
  • Ändern der Symbolleistenfarbe in Appcompat 21
  • Android-Bluetooth-Druck
  • Gradle 2.3.0-alpha1 funktioniert keine Datenbindung
  •  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 habe von hier aus etwas erzählt. Sie haben gesagt, dass die Verwendung von getReadableDatabase (). Ich benutze diese Methode auch. Und ich benutze auch diese Methode,

     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 Fehler wie –

     Database wasn't open. 

    Danach habe ich auch diese Fehler in meiner Datenbank. Also jemand sagt mir Wie erhalte ich die Sicherheit zu schließen für Cursor und Datenbank nach dem Abrufen der Datensätze.

  • Wie kann ich eine Kontext-Aktionsleiste mit der Android-Support-Bibliothek verwenden?
  • Bereitstellung von Android-Anwendungen Qt 5.1
  • SoundPool: Fehler beim Erstellen von AudioTrack
  • Android-Layout mit 2 gleichmäßig beabstandeten Tasten
  • EGL_BAD_MATCH Fehler Android Studio
  • Fehler beim Aufrufen der Methode auf NPObject! In Android 2.2
  • 6 Solutions collect form web for “Wie schließe ich den Cursor und die Datenbank sicher?”

    EDIT: Wenn du einen Cursor zurückgibst, der bereits geschlossen ist, kannst du ihn nicht benutzen. Öffnen Sie die Datenbank, bevor Sie die Methode aufrufen, dann schließen Sie den Cursor und dann die Datenbank nach dem Aufrufen der Methode.

    Sie können den Cursor schließen, nachdem Sie damit fertig sind:

     Cursor cursor = fetchAll(); ... // Do your work with the cursor cursor.close(); 

    Oder wenn du den Cursor von einer Aktivität benutzt und Requirements benötigst (wenn die Aktivität neu gestartet wird, gestoppt …) kannst du dies benutzen:

     Cursor cursor = fetchAll(); startManagingCursor(cursor); // Android will take care of the cursor for you // Do your work with the cursor 

    Um die Datenbank zu schließen (nach dem Schließen des Cursors oder wenn innerhalb einer Aktivität in onDestroy() vorzugsweise):

     dbhelper.close(); 

    In Ihrer Klasse, die ContentProvider erweitert, wenn Sie die Datenbankverbindung öffnen und den Helper als Instanzvariable in onCreate setzen, können Sie die Datenbankverbindung beim Herunterfahren schließen.

     @Override public boolean onCreate() { mOpenHelper = getDBOpenHelper(); return true; } @Override public void shutdown() { mOpenHelper.close(); super.shutdown(); } 

    Bessere Praxis würde es in onResume () öffnen und es in onPause () schließen.

    Jedes Mal, wenn Sie diese Methode-Datenbank aufrufen, wird im Lesemodus geöffnet, aber Sie haben die Datenbank nicht geschlossen, weshalb dieser Fehler auftritt. Offen nur einmal wie aus onCreate () Methode und schließen in destroy ()

    Während du den Cursor nach dem Abrufen der Zeilen schließen kannst und wenn es keinen Cursor mehr gibt, dann schließen und auf Null setzen

    Sie können sich auch auf diese Antwort beziehen (schlägt vor, wo Sie Cursors / db-Objektverbindungen je nach Aktivitätszustand schließen sollten) oder diese (schlägt vor, wie man das SQLiteDatabase-Objekt schließt). Keine Notwendigkeit zu erarbeiten, wenn es schon einmal geschrieben ist. Trotzdem, unten ist Idee für die Kodierung Teil.

      if (dbCursor != null && dbCursor.moveToFirst()) { try { //do stuff } catch (exceptions) { //catch possible exceptions } finally { if (dbCursor != null && !dbCursor.isClosed()) { dbCursor.close(); } } 

    Versuchen Sie, SQLiteDatabase als Parameter an Ihre fetchAll-Methode zu übergeben:

     MyDatabase db = new MyDatabase(this); .... Cursor myCursor = db.fetchAll(db.getReadableDatabase()); myCursor.close(); db.close(); public Cursor fetchAll(SQLiteDatabase db, String listName) { String sql = "select ID _id, Name from ListName where Name = ? order by ID"; Cursor c = db.rawQuery(sql, new String[] { listName }); c.moveToFirst(); return c; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.