39 votes

Tentative de réouverture d'une base de données déjà fermée

Lors de l'utilisation de Room à partir des composants d'architecture Android, j'ai reçu l'erreur suivante lors de la tentative d'accéder à la base de données à l'aide d'un composant Dagger:

J'utilisais la version Dagger et la version Room . L'erreur a été reproductible sur la version `` .

Cette erreur s'est produite sur toute tentative d'accéder à la base de données par le biais d'un DAO après l'initialisation de la base de données et l'injecter dans ma classe.

87voto

James Lendrem Points 956

C'est parce que vous tentez de modifier le schéma de la base de données existante sans lui donner toute l'information sur les migrations. Donc, fondamentalement, il tente d'écrire le nouveau schéma de base de données pour la base de données existante qui ne fonctionne pas.

Il y a deux façons de contourner cela. Si vous êtes dans votre environnement de développement ce que vous pouvez faire est de repli à un destructeur de migration, pour ce faire, votre création de base de données de code devrait ressembler à quelque chose comme ce qui suit:

MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db")
    .fallbackToDestructiveMigration()
    .build();

Cela signifie que lorsque vous fournir la base de données avec une mise à jour ou nouvelle entité, il va faire ce que la réponse de @huw dit et il suffit de supprimer la base de données sur l'installation de l'application suppression de toutes les données et vous donner une nouvelle installation.

L'autre méthode consiste à utiliser une migration de la fonction. Ils sont assez long, de sorte que si quelqu'un veut bien me l'écrire ici, je vais vous laisser pour aujourd'hui, mais, fondamentalement, la documentation peut être trouvée ici:

Salle de DB de la Migration de la Documentation

Essentiellement, cela provoque la DB pour exécuter SQL fournis par vous-même pour mettre à jour la base de données vers la nouvelle version. De cette façon vous pouvez vous assurer qu'aucun de vos données sont perdues lors de la migration; ou aussi peu que possible en fonction de ce que vous faites. C'est la méthode préférée pour la production apps que cela signifie que les utilisateurs ne perdent pas leurs données déjà existantes et vous n'obtiendrez pas beaucoup de colère reviews/des clients perdus.

J'espère que l'aide!

16voto

huw Points 423

Une solution à ce problème était de supprimer le fichier de base de données et de recommencer. Ce n'était pas un problème puisque je ne faisais que tester et que je pouvais repeupler la base de données à l'aide de données en ligne.

Pour ce faire non plus :

  • Infos sur l'application et stockage et données claires
  • Supprimer manuellement le fichier à``

0voto

lomza Points 1763

J'ai eu ce genre d'exception après une migration pas si réussie. Vérifiez toujours la requête SQL que vous utilisez pour une migration. Vous pouvez créer une nouvelle colonne avec un mauvais type de données et la description de l'exception ne sera pas utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X