Zum Beispiel diese Funktion betrachtenöffnen/schließen Datenbank Muster für einzelne vs. mehrere Insertion ruft
public void insertRow(CoolObject coolObject) {
ContentValues values = new ContentValues();
values.put("some field name", coolObject.getSomeValue());
//and so on and so on
mDatabase.open();
mDatabase.insertWithOnConflict("CoolTable",
null,
values,
SQLiteDatabase.CONFLICT_IGNORE);
mDatabase.close();
}
ich die Datenbank öffnen, führen Sie einen SQL-Befehl von einer Art, die Datenbank, dann wieder auf die Datenbank schließen.
Betrachten wir nun diese:
public void insertRows(List<CoolObject> coolObjectList) {
mDatabase.beginTransaction();
try {
for (CoolObject coolObject : coolObjectList) {
insertRow(coolObject);
}
mDatabase.setTransactionSuccessful();
}
finally {
mDatabase.endTransaction();
}
}
In diesem Fall habe ich eine Schleife ausführen, die insertRow()
wiederholt aufruft, sondern im Rahmen einer einzigen Datenbanktransaktion.
Meine Frage:
Ist es ein Problem, dass ich offen und in der Nähe nennen, wie ich tun? Es kann für einen einzelnen Anruf sinnvoll sein, aber ich sorge mich, dass, wenn ich die Einfügerei immer und immer wieder rufe, das Öffnen und Schließen viel ist.
Und wenn die Datenbank bis zum Ende der Zeilenoperation geschlossen ist, muss ich sie wieder öffnen, auch für die Dinge wie mDatabase.beginTransaction();
oder mDatabase.setTransactionSuccessful();
oder mDatabase.endTransaction();
?
Ich kann auch nicht nur die offene nehmen und in der Nähe der insertRow()
aus entweder und fügen Sie es zu Beginn und am Ende der insertRows()
Methode entweder, weil dann ist es, na ja, nicht in insertRow()
so jetzt, wenn ich anrufen will, dass Funktion für sich selbst Ich bin nicht mehr öffnen/schließen.
Was ist der akzeptierte Weg, um diese Fehler zu umgehen?
"Ist das ein Problem, das ich so offen und geschlossen nenne?" - Ich würde es nicht so machen. Öffnen Sie es einmal. Schließen Sie es ... wahrscheinlich nie. Wir haben einige davon [vor ein paar Monaten] besprochen (https://stackoverflow.com/questions/36730859/correct-way-to-open-close-the-database). – CommonsWare
Aber wie können Sie dann garantieren, dass die Datenbank geöffnet ist, wenn Sie 'insertRow()' aufrufen? (Sagt, dass etwas schief läuft, so dass die Datenbank zum Zeitpunkt des Aufrufs von 'insertWithOnConflict()' nicht geöffnet ist) – KaliMa
"Aber wie können Sie dann garantieren, dass die Datenbank geöffnet ist, wenn Sie insertRow() aufrufen?" - Wenn Sie 'SQLiteOpenHelper' verwenden, rufen Sie' getReadableDatabase() 'auf. Dadurch wird die Datenbank geöffnet, wenn sie nicht bereits geöffnet ist.Wenn Sie nicht 'SQLiteOpenHelper' verwenden, rollen Sie Ihren eigenen Lazy-Initialization-Ansatz. Und in Ihrem speziellen Fall wissen Sie, ob es offen ist, bevor Sie 'insertRow()' aufrufen, da es für 'beginTransaction()' geöffnet sein muss. – CommonsWare