Comment utiliser la Salle de Persistance de la Bibliothèque de pré-base de données de population?
Je voudrais utiliser la Salle avec une base de données pré renseignée, mais je ne peux pas comprendre comment le dire à la Chambre où trouver ma base de données.
J'ai maintenant le mettre dans src/main/assets/databases
et quand je créer l'instance de la base de données de chambres-je créer de cette façon:
Room.databaseBuilder(
getApplicationContext(),
AppDatabase.class,
"justintrain.db"
)
.allowMainThreadQueries()
.build();
De cette façon tho, je pense que c'est la création d'une nouvelle base de données à chaque fois, ou de toute façon, ce n'est pas à l'aide de la pré-peuplée.
Comment puis-je faire pour trouver ma base de données?
- Je n'ai pas vu une bonne solution pour ce. J'ai déposé une demande de fonctionnalité pour elle.
- donc ça va prendre un certain temps jusqu'à ce qu'il sera mis en œuvre, je suppose.. connaissez-vous une solution de contournement qui pourraient être utilisées jusqu'alors? (Merci beaucoup en tout cas pour le signaler!)
- Ainsi, on pourrait supposer que la base de données est stockée dans
getDatabasePath()
pour votre base de données nom de fichier. Alors, arrangez-vous pour copier l'élément dans cette voie avant de créer leRoomDatabase
, si ce fichier n'existe pas déjà. C'est la première option que je propose dans cette question, où, idéalement, nous avons davantage de garanties que "getDatabasePath()
pour votre base de données nom de fichier" est la bonne réponse. - cela fonctionne pour vous medium.com/google-developers/... ?
- avez-vous essayé de passer le chemin complet de la base de données dans le constructeur? cette habitude de travailler avec SqliteOpenHelper
- CommonsWare a une bonne solution ici: github.com/commonsguy/cw-androidarch/tree/v0.6/General/...
Vous devez vous connecter pour publier un commentaire.
C'est comment je l'ai résolu, et comment vous pouvez expédier votre application avec une base de données de population (jusqu'à la Chambre v. alpha5)
mettre votre SQLite DB
database_name.db
dans leassets/databases
dossierprendre les fichiers à partir de ce repo et les mettre dans un package appelé c'est à dire
sqlAsset
dans votre
AppDatabase
de classe, de modifier votre Salle de DB de création de code en conséquence:Notez que vous devez utiliser
"database_name.db"
et pasgetDatabasePath()
ou d'autres méthodes: il a juste besoin du nom du fichier.AutoClosable
en cas de besoin), mais incapable de le faire avec beta1 (SupportSQLiteOpenHelper.Configuration
manque quelques trucs siAssetSQLiteOpenHelper
ne peut pas être instanciée)Solution Simple, sans autres bibliothèques externes.
Chambre s'appuie sur l'existant Android code de la structure pour créer ou ouvrir une base de données. Si vous regardez dans le code source de
FrameworkSQLiteOpenHelper
(Salle de la version deSQLiteOpenHelper
), il appelle en interneSQLiteOpenHelper.getReadableDatabase()
et d'autres méthodes où il est nécessaire.Donc, la solution la plus simple est de copier le fichier de base de données de répertoire actif de
mContext.getDatabasePath("my-database.sqlite")
avant la création de la DB avec de la place.Dans votre cas, le code ressemble à ceci -
Ce lien a le code nécessaire pour la copie de la DB - lien avec le code
J'ai eu le même problème j'ai donc créé une bibliothèque qui fait exactement cela.
la accepté de répondre à fonctionner, mais je pense que c'est plus facile d'utiliser une bibliothèque.
L'ajouter à la racine de votre build.gradle à la fin des dépôts:
Ajouter la dépendance
vous pouvez trouver à la bibliothèque ici: https://github.com/humazed/RoomAsset
Context.deleteDatabase()
en Application lors de l'application de mise à niveau.room.schemaLocation
processeur d'annotation d'un argument OU d'ensemble exportSchema à false.vous suffit de copier
assets/databases
àapp/databases
et d'ajouter
addMigrations()
dansdatabaseBuilder
il gardera vos données
Solution similaire avec la pièce sans l'aide de bibliothèques externes:
1. Copie de votre base de données dans le dossier des actifs
2. Copie de votre base de données à partir du dossier des actifs
}