SQLite
 sql >> Base de données >  >> RDS >> SQLite

Android - tentative de réouverture d'un objet déjà fermé :SQLiteQuery à l'aide de loaderManager

Votre code est un peu difficile à comprendre en raison d'un mauvais formatage.

Quoi qu'il en soit, la réponse fournie n'est en fait pas une solution. Le curseur est retourné à onLoadFinished devrait être garanti de ne pas être fermé, vous chargez donc votre curseur de la mauvaise manière. Plus précisément, lorsque vous appelez

adapter.getFilter().filter(s.toString());

Je ne comprends pas vraiment ce qui se passe ici, mais je comprends que vous devriez faire autre chose. Stockez simplement le filtre de requête dans un champ de votre Fragment et exécutez getLoaderManager().restartLoader(DRINKS_LIST_LOADER, null, this); . Notez que vous exécutez restartLoader , et non initLoader , car vous souhaitez interroger différentes données.

Dans votre onCreateLoader , vous devez utiliser le filtre que vous avez stocké en tant que variable d'instance pour la selection .

Un peu de contexte

initLoader charge les données qui ont été chargées lors de la dernière exécution, si elles avaient été exécutées auparavant. C'est pourquoi vous appelez dans la méthode d'initialisation de votre Fragment/Activity. C'est pratique car vous n'aurez pas à redemander le changement d'orientation.

restartLoader nettoie les données précédemment chargées afin que vous obteniez un nouveau Loader pour travailler avec des données (probablement) différentes.

Si vous n'êtes toujours pas sûr de ce que vous faites, assurez-vous de lire cet article, qui est un très bon article d'introduction sur les chargeurs avec un exemple de code qui ressemble beaucoup à ce que vous voulez réaliser. Les chargeurs sont assez énigmatiques au début, mais une fois que vous avez compris, tout se passe bien.