2011-03-07 5 views
7

J'ai un ListView qui affiche les données d'une base de données sqlite. J'ai étendu CursorAdapter pour ce faire. Le code suivant dans mon ListActivity a un gros problème: il les mains sur le curseur sur le CursorAdapterProblème de fuite SQlite Android avec CursorAdapter

private boolean refreshListView() { 
    final boolean result; 
    SqliteHelper sqliteHelper = new SqliteHelper(this); 
    sqliteHelper.open(); 
    final Cursor cursor = sqliteHelper.fetchAll(); 
    if (cursor.getCount() == 0) { 
     //handling some stuff 
    } else { 
     startManagingCursor(cursor); 
     final MyCursorAdapter measures = new MyCursorAdapter(this, cursor); 
     setListAdapter(measures); 
     result = true; 
    }   
    return result; 
} 

J'ai remarqué que ce code conduit à fréquenter IllegalStateExceptions « SQLiteDatabase créé et jamais fermé ».

J'ai essayé de résoudre ce problème en fermant la connexion à la base de données. Mais si je le ferme à partir de cette méthode, je reçois SQLiteMisuseException que je suppose est provoqué par l'adaptateur étant encore au travail et le curseur est toujours nécessaire? J'ai également essayé de fermer la base de données à onPause(). Cela ne résout pas la fuite cependant.

Je ne veux pas d'application qui produise une sorte de mémoire ou une autre fuite. Mais je n'ai aucune idée de ce que je fais de mal. Je n'ai trouvé aucune méthode de rappel ou de cycle de vie en ListActivity ou CursorAdapter qui m'a donné un indice sur la façon dont je devrais gérer cela.

Je serais reconnaissant pour toute indication sur la façon de résoudre ce problème. Je commence à soupçonner que la construction entière est juste fausse. Je peux poster plus de code si nécessaire.

Répondre

9

Vous devez appeler sqliteHelper.open() dans onCreate() et sqliteHelper.close() dans onDestroy().

Activity Lifecycle explique le cycle de vie en détail.

+2

Merci, au début ça n'a pas l'air de marcher mais il s'est avéré que j'avais fait la même erreur dans une autre classe. Je n'ai aucune idée pourquoi je n'ai jamais essayé onDestroy(). J'ai toujours supposé onPause() serait le meilleur endroit, m'apprend à lire au lieu de continuer à assumer des choses. – Yashima