Erneute öffnen eines bereits geschlossenen Objekt: java.lang.IllegalStateException:?
Ich weiß diese Frage wurde oft gefragt in SO,aber ich konnte nicht herausfinden, mein genaues problem.
Ich bin mit dem folgenden code, um die Daten aus der Datenbank(Tabelle1) und ein weiteres update Tabelle2 basiert auf der retrieval-Wert. Seine Ordnung, die in manche android-Versionen, aber wenn ich gegangen, um zu testen mit Android 4.0.3. Ich bin geting dieses java.lang.IllegalStateException:?.attempt to re-open an already-closed object
bei sum_cursor.moveToNext();
.
Ich bin mit diesem code in AsyncTask.
/** Sum of total matched values*/
Cursor sum_cursor = db.gettotalMatchvalue(this);
if(sum_cursor!=null)
{
sum_cursor.moveToFirst();
for(int j=0; j<sum_cursor.getCount();j++)
{
float totalmatchedscore = sum_cursor.getInt(0);
float totalingredients = Float.parseFloat(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_TOTALINCREDIENTS)));
/**average = totalscore/totalingredients*/
double average = totalmatchedscore/totalingredients;
int id = Integer.parseInt(sum_cursor.getString(sum_cursor.getColumnIndex(APPDatabase.CK_ID)));
db.updateAverage(id, average);
sum_cursor.moveToNext(); //Here is the problem
}
}
db.close();
Meine update-Methode Codierung
/** Update average */
public void updateAverage(int id,double average)
{
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues();
values.put(CK_FINALVALUE,average);
db.update(TABLE, values,CK_ID+" = "+id , null);
}
Was mache ich hier falsch?
Ich weiß, viele von Euch in dieser situation. Könnten Sie mir helfen Jungs.
Vielen Dank für Ihre Hilfe.
InformationsquelleAutor der Frage vinothp | 2012-07-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht aktualisieren Sie eine Tabelle während der Iteration über die Ergebnisse einer Abfrage. Es gibt gute Gründe dafür; was, wenn die Daten, die Sie hinzufügen würde dazu führen, dass eine Veränderung der Daten, die Sie Durchlaufen? Ihr cursor würde nicht wieder gültige Daten.
Versuchen, speichern von Daten zurück in die Tabelle in
updateAverage()
ist das problem verursacht. Sie sollten nur daran erinnern, der Durchschnittliche Wert während der Schleife, und dann aktualisieren Sie es einmal am Ende, nachdem Sie fertig sind Schleifen über den cursor.Zur weiteren Erläuterung der genauen Fehlermeldung, die Sie bekommen: das Gesetz, das einfügen von neuen Daten verursacht, die Datenbank zu schließen Sie alle Cursor, die derzeit geöffnet sind, als Sicherheitsmaßnahme. Also, wenn Sie rufen
sum_cursor.moveToNext()
nach der Aktualisierung der Durchschnitt der cursor ein wenig überrascht zu finden, dass es schon geschlossen ist.InformationsquelleAutor der Antwort Graham Borland
Was ist, wenn Sie kommentieren Sie
db.updateAverage(id, average)
?InformationsquelleAutor der Antwort Alexander Kulyakhtin
Können Sie Ihr Ziel erreichen mit reinem SQL geht es schneller und besser aus Architektur-Sicht, weil die gesamte Logik in einer SQL-Transaktion
Verwenden ERSETZEN ODER UPDATE
InformationsquelleAutor der Antwort Lemberg