🔜
【Flutter】SQLiteのデータをiOSエミュレーター→Androidエミュレーターにコピーする
こんにちは、ワニかず@40歳 出戻りエンジニアです。
どんな作業をするにも、もっと楽をしたい、
と思うのがエンジニアの性ですよね。
ということで今回は、
Flutterプロジェクトで、
iOSのデータベースのデータを
Androidにコピーする方法をまとめました。
iOSのテストデータと同じデータを
Androidに入力する手間を省きたくて調べました。
Macの環境
macOS Sequoia15.3
で作業をした際の手順です。
Flutterプロジェクトの条件
- SQLiteを使用
- test.dbというファイル名でデータベースを保存
SQLiteを使っているかどうかは、
Flutterプロジェクト内の「pubspec.yaml」の
sqflite: ^x.x.x
といった記述で確認ができます。
また、データベースのファイル名は
「database_helper.dart」といったデータベースを扱っているソースコード上で
「.db」の拡張子で調べれば出てくると思います。
iOSエミュレーターから取得
- iOSエミュレーターのデバイスIDの確認
xcrun simctl list devices
を実行すると、
-- iOS 18.2 --
iPhone 16 Pro (xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx) (Booted)
iPhone 16 Pro Max (○○○○○○-○○○○-○○○○-○○○○-○○○○○○○○○) (Shutdown)
というような表示が出ると思います。
この「xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx」や「○○○○○○-○○○○-○○○○-○○○○-○○○○○○○○○」が
iOSエミュレーターのデバイスIDです。
- データベースファイルの検索と取得
- デバイスIDが「xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx」
- 検索するデータベースファイルが「test.db」
の場合、
cd ~/Library/Developer/CoreSimulator/Devices/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/data/Containers/Data/Application/
find . -name "test.db" -exec cp {} ~/Desktop/test.db \;
を実行すると、デバイスIDが「xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx」の
データベースファイル「test.db」がデスクトップにコピーされます。
Androidエミュレーターへコピー
- Androidのパッケージ名を確認
Flutterプロジェクト内のAndroid/app/build.gradleを開き、
applicationId = "□□□.□□□□□□.□□□□□□□□"
となっている箇所を探します。
「□□□.□□□□□□.□□□□□□□□」がAndroidのパッケージ名です。
- データベースファイルを上書き
# 一時的な場所にファイルを転送
adb push ~/Desktop/test.db /data/local/tmp/test.db
# 次に、run-asを使って正しい場所にコピー
adb shell "run-as □□□.□□□□□□.□□□□□□□□ cp /data/local/tmp/test.db /data/data/□□□.□□□□□□.□□□□□□□□/databases/test.db"
# 権限を設定
adb shell "run-as □□□.□□□□□□.□□□□□□□□ chmod 660 /data/data/□□□.□□□□□□.□□□□□□□□/databases/test.db"
# 一時ファイルを削除
adb shell "rm /data/local/tmp/test.db"
Discussion