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 を追加します。
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」ボタンを押します。
共有メニューが出てきました。簡単ですね。
実際にDBの中身見てみる
いろんな選択肢がありますが、一番手っ取り早そうなのは AirDrop でしょうか。
事前に Mac に SQLite のDB ファイルを参照できるアプリをインストールしておきます。
Downloads - DB Browser for SQLite
共有メニューの AirDrop 先から選択して、Mac 側で受け入れます。
そのファイルを開くと…
生データが参照できます!じゃーん。
今回のサンプルは以下にアップしてあります。
GitHub - shunsuke-kawai/SQLiteExportSample