Microsoft 系のあれこれ

港区の SIer で よくわからんことをしている SE みたいな人です。Xamarin 中心です。

Xamarin.Forms 製の iOS アプリから SQLite のDB ファイルをエクスポートする機能を追加する

内部で使うとかで適当に作ったアプリのDBファイル内のデータが確認したくなりました。
ちゃんとサーバーにデータを保存すればいい

まとめ

  • Xamarin.Essentials.Share を使ってアプリ内部データを取り出して共有するのが簡単だった。
  • Xamarin.Essentials Ver.1.1.0 の時点ではファイル共有は Preview です。

サンプルプロジェクト

公式ドキュメントに SQLite のサンプルがあるので、そいつに機能追加します。
Xamarin.Forms のローカル データベース - Xamarin | Microsoft Docs
上のドキュメントのリンク先から Zip でダウンロードできます。
Todo - Xamarin

サンプルプロジェクトに DB 出力ボタンを追加する

TodoListPage.xaml に ToolbarItem を追加して OnExportDbFile イベントを追加します。

<ContentPage.ToolbarItems>
    <ToolbarItem Clicked="OnItemAdded" Text="+">
        <ToolbarItem.Icon>
            <OnPlatform x:TypeArguments="FileImageSource">
                <On Platform="Android, UWP" Value="plus.png" />
            </OnPlatform>
        </ToolbarItem.Icon>
    </ToolbarItem>
    <ToolbarItem Clicked="OnExportDbFile" Text="Share">
        <ToolbarItem.Icon>
            <OnPlatform x:TypeArguments="FileImageSource">
                <On Platform="Android, UWP" Value="plus.png" />
            </OnPlatform>
        </ToolbarItem.Icon>
    </ToolbarItem>
</ContentPage.ToolbarItems>

Xamarin.Essentials を NuGet から追加

有機能を利用するため、Xamarin.Essentials を追加します。
f:id:ShunsukeKawai:20190604180224p:plain
Xamarin.Essentials に関しては公式ドキュメントを参照ください。
Xamarin.Essentials:共有 - Xamarin | Microsoft Docs

スタートアップのコードに宣言を追加する

Xamarin.Essentials Ver.1.1.0 (2019/06/04 時点)ではファイル共有はまだ Preview のため、明示的にアプリのスタートアップに宣言が必要みたいです。

ExperimentalFeatures.Enable(ExperimentalFeatures.ShareFileRequest);

App.cs のコンストラクタに上記宣言を追加します。

public App()
{
    ExperimentalFeatures.Enable(ExperimentalFeatures.ShareFileRequest);

    Resources = new ResourceDictionary();
	Resources.Add("primaryGreen", Color.FromHex("91CA47"));
	Resources.Add("primaryDarkGreen", Color.FromHex("6FA22E"));
    var nav = new NavigationPage(new TodoListPage());
	nav.BarBackgroundColor = (Color)App.Current.Resources["primaryGreen"];
	nav.BarTextColor = Color.White;

	MainPage = nav;
}

DB ファイルパス取得のメソッド追加

どのファイルを共有するかをパスで指定するため、TodoItemDatabase.cs にパス取得用メソッドを追加します。

public string GetDbPath() => database.GetConnection().DatabasePath;

ボタンの処理に共有処理を追加する

これで準備完了なので、TodoListPage.xaml.cs のボタン押下時のイベントに出力処理を追加します。

private async void OnExportDbFile(object sender, EventArgs e)
{
    await Share.RequestAsync(new ShareFileRequest
    {
        File = new ShareFile(App.Database.GetDbPath())
    });
}

アプリを起動して確認する

※ ファイル共有はシュミレーターだと、共有先の選択肢がないため、実機で確認しています。
適当にデータを追加した後に、「Share」ボタンを押します。
f:id:ShunsukeKawai:20190604190921p:plain
共有メニューが出てきました。簡単ですね。
f:id:ShunsukeKawai:20190604190959p:plain

実際にDBの中身見てみる

いろんな選択肢がありますが、一番手っ取り早そうなのは AirDrop でしょうか。
事前に MacSQLite のDB ファイルを参照できるアプリをインストールしておきます。
Downloads - DB Browser for SQLite

共有メニューの AirDrop 先から選択して、Mac 側で受け入れます。
そのファイルを開くと…
f:id:ShunsukeKawai:20190604190152p:plain
生データが参照できます!じゃーん。

今回のサンプルは以下にアップしてあります。
GitHub - shunsuke-kawai/SQLiteExportSample