SQLite-connection-Objekt geleakt - Android
Mache ich meine erste android-app, und ich nahm einige sqlite tutorials Erstens, dass lehrte mich, eine databaseHelper, extends SQLiteOpenHelper. Also mein databaseHelper nicht verlängern SQLiteOpenHelper. Bekomme ich ein sqlite-connection-Leck-Warnung in der Logcat so würde wie einige Ratschläge, was zu tun um das zu beheben.
Bekomme ich diesen Fehler:
02-01 21:39:50.740: W/SQLiteConnectionPool(32061): A SQLiteConnection object for database '/data/data/com.btf271.fashionassistant/databases/clothingManager' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
Mein databaseHelper Funktionen, die aufgerufen werden, wo das Leck:
public List<Sticker> getObjectsByGenderAndCategory(String gender, String category) {
List<Sticker> objects = new ArrayList<Object>();
String selectQuery = String.format(
"SELECT * FROM %s WHERE %s = \"%s\" AND %s = \"%s\"",
TABLE_OBJECT, KEY_GENDER, gender, KEY_CATEGORY, category);
Log.e(LOG, selectQuery);
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(selectQuery, null);
try{
// looping through all rows and adding to list
if (c.moveToFirst()) {
do {
Object o = createClothingItemJavaObject(c);
// adding to object list
objects.add(o);
} while (c.moveToNext());
}
}finally {
c.close();
db.close();
}
return objects;
}
Fand ich dies werde ich versuchen morgen. Es ist spät.
Dank.
Möglich, Duplikat der SQLite-Verbindung zugespielt, obwohl alles geschlossen
InformationsquelleAutor user3164083 | 2014-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alles, was ich Tat, war implementieren Sie diese Antwort auf eine ähnliche Frage und jetzt es nicht in die SQL-connection-Objekt-leak-Fehler. Ich kann nicht empfehlen, diese genug. Es dauerte nur ein paar Minuten zu implementieren und zu gearbeitet.
Hier ist der code:
InformationsquelleAutor user3164083
Ich behoben durch hinzufügen
meiner erweiterten Klasse SQLiteOpenHelper
Es funktioniert, vielen Dank:)
Dies macht den Fehler Weg, indem er versteckt sich das Leck. Es ist keine gute Lösung, da die Datenbank-Verbindung wird erst geschlossen, wenn die garbage-collection - möglicherweise viel später als Sie sollte geschlossen haben.
ich Verstand, dass dies gelöst wird die Leckage in einem diselegant Weise, nicht, dass es maskiert das problem. was schlagen Sie vor?
Die Fertigstellung läuft nur einige Zeit, nachdem die Datenbank-Verbindung ist komplett unbenutzt UND nicht richtig schließen()-d.... Sie würden besser tun, um explizit close() die Datenbank-Verbindung, wenn Sie fertig sind mit ihm, das ist, was diese Warnung versucht Sie zu ermutigen, das zu tun.
InformationsquelleAutor Javi Martínez
Jedem Aufruf
getReadableDatabase()
undgetWritableDatabase()
zu einer entsprechendenclose()
auf der gleichen Datenbank-Objekt.Beispielsweise Ihre
getAllClothingItemsByGenderAndCategory()
AnrufegetReadableDatabase()
aber nichtclose()
. Hinzufügendb.close()
nachc.close()
.Ihre
closeDB()
keinen Sinn macht, da bekommt er einen neuen Verweis auf die Datenbank mitgetReadableDatabase()
und schließt nur , dass. Es tut nichts, um zu schließen Sie eine vorhandene Datenbank-Verbindung.Es gibt nicht genug Kontext, um zu sagen, wo es angebracht wäre, in der Nähe der Hl.
Ok, also ich denke, dass mir sagt, dass ich nicht nur schließen Sie es jedes mal, wenn ich instanziieren, wenn ich fertig bin. Cheers. Jede situation sollte ich es schließen? Etwas Kontext ist, dass der code-block wird in eine onCreate (), um einige Informationen über die Benutzer der app.
InformationsquelleAutor laalto
Jedes mal, wenn Sie eine Datenbank öffnen(lesbar oder beschreibbar) und cursor, die verwendet Speicher-Ressourcen werden freigegeben, indem Sie mit ".close();" nach Ihrer Verwendung endet in jedem Datenbank-Funktion.. von your_database Objekt.close(); cursor-Objekt.close();
InformationsquelleAutor