web-dev-qa-db-ja.com

Android:ルームで作成されたSQLiteデータベースは、sqlite-browserで開くとテーブルを表示しません

私はRoom Persistence Library 1.1.を使用しています。 Android Studioのデバイスファイルエクスプローラーを使用して/data/data/<package_name>/databases/でデータベースファイルを見つけることができました。これには複数のテーブルが含まれており、room-DAOsを使用して問題なくそのテーブルのコンテンツにアクセスできます。ただし、sqlite-browserで開くと、テーブルが表示されません。

その理由は何でしょうか?部屋から古いSQLiteOpenHelperに切り替えずに問題を解決することはできますか?

16

解決

そのようなデータベース*をsqlite-browserで開くには、3つのファイルすべてをコピーする必要があります。すべてが同じディレクトリにある必要があります。

*質問で述べられているように複数のファイルに保存されたデータベース。


なぜ3つのファイルなのですか?

ドキュメントに従って、バージョン1.1.0以降、Roomは、十分なRAMがあり、APIレベル16以上で実行されているデバイスのデフォルトのジャーナルモードとしてwrite-ahead loggingを使用します。 Truncateこのバージョンまでのすべてのデバイス。write-ahead loggingは、Truncateと比較して内部構造が異なります。


SQLiteが時々使用するファイル一時ファイルを見てください:

バージョン1.1.0まで

enter image description here

バージョン1.1.0以降

enter image description here


ジャーナルモードを明示的にTruncateに変更する場合は、この方法で行うことができます。ただし、WALTruncateよりもはるかに優れているため、推奨されません

public static void initialize(Context context) {
    sAppDatabase = Room.databaseBuilder(
            context,
            AppDatabase.class,
            DATABASE_NAME)
        .setJournalMode(JournalMode.TRUNCATE).build();
}


Truncateに変更せずに単一のファイルに移動することはできますか?

はい、そうです。データベースに対して次のステートメントをクエリします。

pragma wal_checkpoint(full)

詳細はこちら こちら

40

AndroidStudioのデバイスファイルエクスプローラーからPCのディレクトリに3つのファイルをすべてコピーし、DBite in SQLite( http://sqlitebrowser.org )でdbファイルを開きます。 3つのファイルがすべて同じフォルダにあることを確認してください。

9
Sanju Varghese

wal_checkpointプラグマ checkpoint をトリガーして、WALファイルトランザクションをデータベースに戻します。

        theRoomDb.query("pragma wal_checkpoint(full)", null)

または

        // the result
        // contains 1 row with 3 columns
        // busy, log, checkpointed
        Cursor cursor = theRoomDb.query("pragma wal_checkpoint(full)", null)

プラグマパラメータの値と結果の詳細については、 PRAGMAステートメント を参照してください。

WALが有効になっていない場合、プラグマは何もしません。ちなみに、Room 1.1.1でテストしましたが、デフォルトではWALモードが使用されていなかったため、有効にする必要がありました。

2
bwt

ルームデータベースのエクスポートおよびインポートソリューション

私のプロジェクトの1つで同じ問題に直面していますが、この問題を解決するために2日間を費やしています。

ソリューション

ルームライブラリの複数のインスタンスを作成しないでください。すべての問題を引き起こす複数のインスタンス。

MyApplication

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!!
}
}

このインスタンスを任意の数のアクティビティまたはフラグメントで使用します。

{
    var allcustomer = MyApplication.mInstanceDB.customerDao.getAll()
}

エクスポートとインポートはこのライブラリを使用します

implementation 'com.ajts.androidmads.sqliteimpex:library:1.0.0'

Githubリンク

0
Prabhu V