家の回線調子わるい
本題
Androidのデータベース、Roomのバックアップを取りたい
他のスマホにデータベースを移したい
データベースのファイル どこ?
data/data/${packageName}/databases
にある。
なおこんな面倒なことしなくても、Context#databaseList()
を使うとこのフォルダに入ってるファイルの名前を配列で返してくれるし、
これを使ってContext#getDatabasePath()
を使えばパスが取れる。
なお、data/data
はroot
権限がないと見れないが、開発中のアプリはAndroid StudioのDevice File Explorer
から見ることができる。
どれがデータベースのファイル?
.db
と.db-shm
と.db-wal
をコピーすれば多分見れる。
.db
ファイル一個だけにしたい場合は、Room.databaseBuilder
のときにsetJournalMode(RoomDatabase.JournalMode.TRUNCATE)
を呼べばもしかすると.db
一個だけになるかもしれない。
バックアップ
今回はContext#getExternalFileDir()
の場所に保存したいと思います。
なおAndroid 10
まではファイルマネージャーで見ることができますが、Android 11
ではサードパーティファイルマネージャーでは見れません。
Android標準のファイルマネージャー(com.google.android.documentui
)を開ければ見れると思います(Pixel以外はしらん)
sdcard/Android/data/パッケージ名/files
にあると思います。
なんか思ったよりきれいに書きことができた
リストア
コピーのときと同じように、Context#getExternalFilesDir()
にデータベースのデータが有るとして、
そいつらをdata/data/パッケージ名/databases
に移せばおk
ファイルピッカーで選ばせたほうがいいよね
Storage Access Framework
でユーザーにファイルを選ばせる(作成、復元)ほうがいいと思います。
ただ複数のファイルを選ぶ機能はSAF
には(多分)無いので、データベースのファイルをzip
ファイルにまとめて扱うことになりそう(他にもあるかも)
というわけで例です:
Activity Result API
を使うので、app/build.gradle
に数行足してください。
バックアップする
リストアする
以上です。
おわりに
Caused by: java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
これは、app/build.gradle
にimplementation 'androidx.fragment:fragment-ktx:1.3.0'
を付け足すと直ります?
Activity
しか使わんしって思ったんですけどだめっぽいです。