🔜

【Flutter】SQLiteのデータをiOSエミュレーター→Androidエミュレーターにコピーする

2025/02/19に公開

こんにちは、ワニかず@40歳 出戻りエンジニアです。
どんな作業をするにも、もっと楽をしたい、
と思うのがエンジニアの性ですよね。

ということで今回は、
Flutterプロジェクトで、
iOSのデータベースのデータを
Androidにコピーする方法をまとめました。

iOSのテストデータと同じデータを
Androidに入力する手間を省きたくて調べました。

Macの環境

macOS Sequoia15.3
で作業をした際の手順です。

Flutterプロジェクトの条件

  1. SQLiteを使用
  2. test.dbというファイル名でデータベースを保存

SQLiteを使っているかどうかは、
Flutterプロジェクト内の「pubspec.yaml」の

sqflite: ^x.x.x

といった記述で確認ができます。

また、データベースのファイル名は
「database_helper.dart」といったデータベースを扱っているソースコード上で
「.db」の拡張子で調べれば出てくると思います。

iOSエミュレーターから取得

  1. 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です。

  1. データベースファイルの検索と取得
  • デバイス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エミュレーターへコピー

  1. Androidのパッケージ名を確認
    Flutterプロジェクト内のAndroid/app/build.gradleを開き、
applicationId = "□□□.□□□□□□.□□□□□□□□"

となっている箇所を探します。

「□□□.□□□□□□.□□□□□□□□」がAndroidのパッケージ名です。

  1. データベースファイルを上書き
# 一時的な場所にファイルを転送
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