nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Xamarin.FormsでSQLiteをPCL内で完結して使う方法

Xamarin公式のWebサイトの、SQLiteのサンプルコードではDependencyServiceを使ったものが紹介されています。

developer.xamarin.com

しかしよくよく見てみると、プラットフォームに依存しているコードはファイルシステムへアクセスしている箇所だけなのが分かります。
てことは、Xamarin.PluginsのPCLStorageを使えば、Navigate側にコードを書かなくてもいけるんじゃね?
ってことで、検証してみた結果を紹介いたします。

今回はポイントの紹介とソースの公開だけで、細かい説明はまた別途書こうと思います(タブン

まず初めに、ポイントだけ説明します。
詳しい人はここだけで十分かもしれませんねw

  1. SQLiteのパッケージは「sqlite-net-pcl」推奨
  2. Xamarin.Formsの初期化完了前に、PCLStorage(というよりXamarin.Plugins)は利用できない点に注意

Xamarin.Formsで利用可能なSQLiteライブラリにはもう一つ「SQLite.Net-PCL」というのがありますが(他にもあるかもしれませんが、そこまで調べられていません)、こちらはSQLiteConnectionのインスタンス化がNative側でしかインスタンス化できない(と思う)ので、必然的に「sqlite-net-pcl」を利用する必要があります。

www.nuget.org

「Xamarin.Formsの初期化完了前に~」ですが、以下のようにXAML上でViewModelをインスタンス化し、ViewModelのコンストラクタでSQLiteの初期化処理を実施しようとしたところ、うまく動きませんでした。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="~"
             x:Class="Hoge.Foo.Bar">
  <ContentPage.BindingContext>
    <local:XxxViewModel/>
  </ContentPage.BindingContext>

Xamarin.PluginsはあくまでXamarin.Forms前提の技術なので、おそらくXamarin.Formsの初期化が完了する前に利用することができない制約があるのだと思います。

OnAppearing以降であれば問題なく動作します。

細かい実装はまた今度まとめるつもりですが、ひとまずは以下にコードを公開していますので、良かったら見てみてください。

github.com

リンク先のXFormsSQLiteSampleプロジェクト内のItemsPage.xaml.csにまとまっています。

以上です。
それではまた!