J'utilise Room Persistence Library 1.1.0 . Je pouvais trouver le fichier de base de données à l'adresse /data/data/<package_name>/databases/
à l'aide de l'explorateur de fichiers du périphérique d'Android Studio. Il contient plusieurs tables et je peux accéder au contenu de ces tables sans aucun problème en utilisant room-DAO
s. Cependant, lorsqu’il ouvre avec sqlite-browser
, il n’affiche aucune table.
Quelle pourrait être la raison? Est-il possible de résoudre le problème sans revenir à l'ancienne SQLiteOpenHelper
de room
?
Pour ouvrir ces bases de données * avec sqlite-browser
, vous devez copier les trois fichiers. Tous doivent être dans le même répertoire aussi.
* Les bases de données stockées dans plusieurs fichiers comme indiqué dans la question.
Conformément à la documentation, à partir de la version 1.1.0
, Room utilise write-ahead logging
comme mode de journal par défaut pour les périphériques disposant de suffisamment de ressources RAM et fonctionnant au niveau 16 ou supérieur de l'API. C'était Truncate
pour tous les appareils jusqu'à cette version. write-ahead logging
a une structure interne différente de celle de Truncate
.
Jetez un coup d’œil aux fichiers fichiers temporaires utilisés par SQLite
de temps en temps:
Jusqu'à la version 1.1.0
À partir de la version 1.1.0
Si vous voulez changer explicitement le mode de journal en Truncate
, vous pouvez le faire de cette façon. Mais, il n'est pas recommandé car WAL
est bien meilleur comparé à Truncate
.
public static void initialize(Context context) {
sAppDatabase = Room.databaseBuilder(
context,
AppDatabase.class,
DATABASE_NAME)
.setJournalMode(JournalMode.TRUNCATE).build();
}
Truncate
?Oui, ça l'est. Interrogez l'instruction suivante sur la base de données.
pragma wal_checkpoint(full)
Ici est un post connexe par moi-même.
Copiez les trois fichiers de Device File Explorer dans AndroidStudio dans le répertoire de votre ordinateur et ouvrez le fichier db dans Db Browser for SQLite ( http://sqlitebrowser.org ). Assurez-vous que les trois fichiers sont dans le même dossier.
Vous pouvez utiliser le pragma wal_checkpoint
pour déclencher un checkpoint qui déplacera les transactions du fichier WAL dans la base de données.
theRoomDb.query("pragma wal_checkpoint(full)", null)
ou
// the result
// contains 1 row with 3 columns
// busy, log, checkpointed
Cursor cursor = theRoomDb.query("pragma wal_checkpoint(full)", null)
Voir Instructions PRAGMA pour plus de détails sur les valeurs et les résultats du paramètre pragma.
Si le WAL n'est pas activé, le pragma ne fait rien .. A propos, j'ai testé avec Room 1.1.1, et le mode WAL n'était pas utilisé par défaut, je devais l'activer.
Solution d'exportation et d'importation de base de données de salles
Je suis confronté au même problème dans l'un de mes projets, je passe deux jours à résoudre ce problème.
Solution
Ne créez pas plusieurs instances pour la bibliothèque de pièces. Plusieurs instances créant tous les problèmes.
Mon application
class MyApplication: Application()
{
companion object {
lateinit var mInstanceDB: AppDatabase
}
override fun onCreate() {
super.onCreate()
mInstanceDB = AppDatabase.getInstance(this)
}
}
AppDatabase
fun getInstance(context: Context): AppDatabase
{
if (sInstance == null) {
sInstance = Room.databaseBuilder(context.applicationContext,AppDatabase::class.Java, "database").allowMainThreadQueries().build()
return sInstance!!
}
}
Maintenant, utilisez cette instance dans un nombre quelconque d'activités ou de fragments, comme cela
{
var allcustomer = MyApplication.mInstanceDB.customerDao.getAll()
}
L'exportation et l'importation utilisent cette bibliothèque
implementation 'com.ajts.androidmads.sqliteimpex:library:1.0.0'