Xamarin.FormsでSQLiteを使ってみる
Xamarin.FormsでSQLiteを使ってみる
私は現在Xamarin.Formsを使ってAndroidのアプリ制作をしています。(iosもいい加減ライセンス取得しないと、、、)
今までは内部ストレージにデータを登録する機能を実装してきませんでした。しかし、今配信しているアプリに追加したい機能があるのですが、その機能には内部ストレージにデータを保存する必要があります。
内部ストレージに保存する機能は、OSによって実装方法が異なってしまいます。そのためXamarin.Fromsを使っていながらもOSごとにコードを書かなくてはならず大変です。そこで調べたところSQLiteのライブラリが存在し、このあたりのコード記述が楽になるそうです。
なので今回はSQLiteを使った実装をまとめたいと思います。
事前準備
SQLiteの実装をするにあたり、ライブラリのインストールやインターフェイスなどを実装しておきます。
- NuGetでsqlite-ner-pclをダウンロードする
- インターフェイスを実装する
- 各OSごとにクラスを実装する
- Android
- iOS
まずはライブラリをインストールします。NuGetで「sqlite-net-pcl」をPCL,Android,iOSにインストールします。
似ているものも存在しているので気をつけてください。
PCLに以下のインターフェイスを実装します。
※namespaceは今回デジタル英単語帳(中学)のを使っています。
using System;
using SQLite;
namespace juniorEnglish
{
public interface ISQLiteDb
{
SQLiteAsyncConnection GetConnection(string str);
}
}
GetConnectionの引数には、データベース名の文字列をいれます。
using System;
using System.IO;
using juniorEnglish.Droid;
using SQLite;
using Xamarin.Forms;
[assembly: Dependency(typeof(SQLiteDb))]
namespace juniorEnglish.Droid
{
public class SQLiteDb : ISQLiteDb
{
public SQLiteDb()
{
}
public SQLiteAsyncConnection GetConnection(string str)
{
var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var path = Path.Combine(documentsPath, str);
return new SQLiteAsyncConnection(path);
}
}
}
using System;
using System.IO;
using juniorEnglish.iOS;
using SQLite;
using Xamarin.Forms;
[assembly: Dependency(typeof(SQLiteDb))]
namespace juniorEnglish.iOS
{
public class SQLite : ISQLiteDb
{
public SQLiteAsyncConnection GetConnection(string str)
{
var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var path = Path.Combine(documentsPath, str);
return new SQLiteAsyncConnection(path);
}
}
}
この部分のコードはAndroidもiosも同じですね。
あとは、メインページなどにデータベースへの追加や削除、更新などを実装していきます。
データベースへの追加、削除
SQLiteは普通のデータベースのようにsql文を記述することもできるようですが、今回はsql文を使用しないでデータベースへの追加、削除を実装したいと思います。
しかし、テーブルを作らないことにはデータベースは利用できないのですが、テーブル作成にもsql文を使用せずにクラスから作成を行います。
以下のようにテーブルを作成するためにクラスを実装します。
public class SaveWord
{
[PrimaryKey]
public int WordNumber { set; get; }
public string JapaneseWord { set; get; }
public string EnglishWord { set; get; }
}
このように、セッターとゲッターを実装した変数を用意します。なお主キーには[PrimaryKey]を記述します。なんとこれだけでいいのです。
それでは本題のデータベースへの接続以降の処理を記述します。
public partial class MainPage : ContentPage
{
private SQLiteAsyncConnection _connection;
List<SaveWord> saveWords = new List<SaveWord>();
public MainPage()
{
InitializeComponent();
_connection = DependencyService.Get<ISQLiteDb>().GetConnection("sqlite.db3");
}
protected override async void OnAppearing()
{
await _connection.CreateTableAsync<SaveWord>();
var saveWord = _connection.Table<SaveWord>().ToListAsync();
saveWords = saveWord.Result;
}
public async void OnAdd(int _number, string _english, string _japanese)
{
var saveItem = new SaveWord
{
WordNumber = _number,
JapaneseWord = _english,
EnglishWord = _japanese
};
await _connection.DeleteAsync(saveItem);
}
public async void OnDelete(int _number, string _english, string _japanese)
{
var saveItem = new SaveWord
{
WordNumber = _number,
JapaneseWord = _english,
EnglishWord = _japanese
};
await _connection.InsertAsync(saveItem);
}
}
ざっとこんな感じです。どうですか?テーブル用のクラスを作成するだけで、テーブル作成から追加、削除が簡単に実装できます。もちろんこれは一部分ですが、データベースの操作はこれで十分です!
あとは各自リストなどでデータを管理しておくなりすれば、大丈夫です。
まとめ
今回は、Xamarin.FormsでSQLiteの使い方をまとめました。
データベースで必須のSQL文を書かなくても、メソッドだけでデータの追加削除ができるのは大きいですね。
もちろん、もっとデータベースをいじるならSQL文が書けたほうがいいですが、、特に今後Web系をやるなら、、
最近はユーザーデータをサーバーに保存するのがメジャーですが、端末内に直接データを保存するならSQLiteは有効ですね!
これをもっと活用してアプリの機能を追加していきたいと思います。
今回はこの辺で、ではまた!