Essayez de rouvrir un objet déjà fermé: java.lang.IllegalStateException :?
Je sais que cette question a demandé à de nombreuses reprises dans l'affirmative,mais je ne pouvais pas comprendre mon problème exact.
J'utilise le code suivant pour obtenir les données à partir de la base de données(Table1) et de mettre à jour un autre Table2 basé sur la récupération de la valeur. Sa fonctionne très bien dans certaines versions d'android, mais quand je allé faire l'essai avec Android 4.0.3. Je suis geting ce java.lang.IllegalStateException:?.attempt to re-open an already-closed object
à sum_cursor.moveToNext();
.
Je suis en utilisant ce code dans 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();
Ma mise à jour de la méthode de codage
/** 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);
}
Ce que je fais de mal ici?
Je sais que vous êtes nombreux à venir à travers cette situation. Pourriez-vous m'aider les gars.
Merci pour votre aide.
source d'informationauteur vinothp
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas mettre à jour une table lors de l'itération sur les résultats d'une requête. Il y a de bonnes raisons pour cela; que si les données que vous ajoutez serait la cause d'une modification aux données vous êtes à parcourir? Votre curseur de ne pas renvoyer des données valides.
Tentez de stocker des données dans la table en
updateAverage()
est à l'origine du problème. Vous faut juste se rappeler de la valeur moyenne au cours de la boucle, et puis la mise à jour une fois à la fin après que vous avez terminé la boucle au-dessus de votre curseur.D'expliquer l'erreur exacte que vous obtenez: la loi de l'insertion de nouvelles données est à l'origine de la base de données pour fermer toutes les curseurs qui sont actuellement ouverts, comme une mesure de sécurité. Ainsi, lorsque vous appelez
sum_cursor.moveToNext()
après la mise à jour de la moyenne, le curseur est un peu surpris de trouver qu'il est déjà fermé.Que si vous commentez
db.updateAverage(id, average)
?Vous pouvez atteindre votre objectif avec la pure SQL il est plus rapide et mieux de l'architecture point de Vue, parce que la logique sera dans une transaction SQL
Utilisation REMPLACER OU MISE à jour