私はRoom Persistence Library 1.1.を使用しています。 Android Studioのデバイスファイルエクスプローラーを使用して/data/data/<package_name>/databases/
でデータベースファイルを見つけることができました。これには複数のテーブルが含まれており、room-DAO
sを使用して問題なくそのテーブルのコンテンツにアクセスできます。ただし、sqlite-browser
で開くと、テーブルが表示されません。
その理由は何でしょうか?部屋から古いSQLiteOpenHelper
に切り替えずに問題を解決することはできますか?
そのようなデータベース*をsqlite-browser
で開くには、3つのファイルすべてをコピーする必要があります。すべてが同じディレクトリにある必要があります。
*質問で述べられているように複数のファイルに保存されたデータベース。
ドキュメントに従って、バージョン1.1.0
以降、Roomは、十分なRAMがあり、APIレベル16以上で実行されているデバイスのデフォルトのジャーナルモードとしてwrite-ahead logging
を使用します。 Truncate
このバージョンまでのすべてのデバイス。write-ahead logging
は、Truncate
と比較して内部構造が異なります。
SQLite
が時々使用するファイル一時ファイルを見てください:
バージョン1.1.0まで
バージョン1.1.0以降
ジャーナルモードを明示的にTruncate
に変更する場合は、この方法で行うことができます。ただし、WAL
はTruncate
よりもはるかに優れているため、推奨されません。
public static void initialize(Context context) {
sAppDatabase = Room.databaseBuilder(
context,
AppDatabase.class,
DATABASE_NAME)
.setJournalMode(JournalMode.TRUNCATE).build();
}
Truncate
に変更せずに単一のファイルに移動することはできますか?はい、そうです。データベースに対して次のステートメントをクエリします。
pragma wal_checkpoint(full)
詳細はこちら こちら 。
AndroidStudioのデバイスファイルエクスプローラーからPCのディレクトリに3つのファイルをすべてコピーし、DBite in SQLite( http://sqlitebrowser.org )でdbファイルを開きます。 3つのファイルがすべて同じフォルダにあることを確認してください。
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モードが使用されていなかったため、有効にする必要がありました。
ルームデータベースのエクスポートおよびインポートソリューション
私のプロジェクトの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'