web-dev-qa-db-fra.com

Android: la base de données SQLite créée avec room ne montre aucune table lors de l'ouverture avec sqlite-browser

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-DAOs. 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?

9
Anees

Solution

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. 


Pourquoi trois fichiers?

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

 enter image description here

À partir de la version 1.1.0

 enter image description here


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();
}


Est-il possible de le déplacer dans un fichier unique sans passer à 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.

16
Anees

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.

6
Sanju Varghese

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.

1
bwt

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'

Lien Github

0
Prabhu V