rksoftware

Visual Studio とか C# とかが好きです

Xamarin Android で SQLite を使う

SQLite は Android の API をラップ下 API で素直に扱うことができます。
Android.Database.Sqlite.SQLiteOpenHelper クラスのサブクラスを作って素直に使えば OK です。

コード

・MySQLiteHelper / Android.Database.Sqlite.SQLiteOpenHelper のサブクラス

class MySQLiteHelper : Android.Database.Sqlite.SQLiteOpenHelper
{
    private static string DbName { get; } = "northwind";
    private static int Version { get; } = 1;

    public MySQLiteHelper(Context context):base(context, DbName, null, Version)
    {
        ;
    }

    public override void OnCreate(SQLiteDatabase db)
    {
        // データベースの初期化。テーブルの作成などする
        db.ExecSQL("Create Table Tran(Id integer primary key autoincrement, Name text, MId integer)");
        db.ExecSQL("Create Table Master(MId integer primary key autoincrement, MName text)");
    }

    public override void OnUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        // アプリケーションのアップグレード時の処理を書くなどする
        ;
    }
}

・MainActivity

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        // UI の構築。ボタンを一つ置いてイベントハンドラを設定
        SetContentView(Resource.Layout.Main);
        var button = new Button(this) { Text = "button" };
        ((Android.Views.ViewGroup)FindViewById<Android.Views.ViewGroup>(Android.Resource.Id.Content).GetChildAt(0)).AddView(button);
        button.Click += Button_Click;
    }

    // ボタンクリックのイベントハンドラ
    private void Button_Click(object sender, System.EventArgs e)
    {
        using (var db = new MySQLiteHelper(this.ApplicationContext).WritableDatabase)
        {
            {// 一つ目のテーブルに値を追加
                var values = new Android.Content.ContentValues();
                values.Put("Name", "N" + System.DateTime.Now.ToString());
                values.Put("MId", 1);
                db.Insert("Tran", null, values);
            }
            {// 二つ目のテーブルに値を追加
                var values = new Android.Content.ContentValues();
                values.Put("MName", "MN" + System.DateTime.Now.ToString());
                db.Insert("Master", null, values);
            }

            {// テーブルを Join して値を取得
                var text = new System.Text.StringBuilder();
                using (var cursor = db.RawQuery("Select * From Tran Inner Join Master On Tran.MId = Master.MId", null))
                {
                    while (cursor.MoveToNext())
                    {
                        foreach (var index in System.Linq.Enumerable.Range(0, cursor.ColumnCount))
                        {
                            text.AppendLine($"{cursor.GetColumnName(index)}:{cursor.GetString(index)}");
                        }
                        text.AppendLine();
                    }
                }
                // 取得結果を表示
                new AlertDialog.Builder(this).SetMessage(text.ToString()).Show();
            }
        }
    }
}

ポイント

MainActivity クラスでの Insert や Select はまあ見れば大体 OK でしょう。
Insert も Select も複数のメソッドがありますが、そこはまた後日。
今回は、MySQLiteHelper クラスの OnCreate メソッドに注目しておきます。
OnCreate メソッドはアプリがインストールして最初にデータベースを使う際に呼び出され、データベースの初期化をします。
上記では、テーブルを作成しています。初期データも設定する必要があればここでやっておくのが良いでしょう。

もう一つポイント

もう一つ、OnUpgrade メソッドもポイントです。
アプリのアップデートで、テーブルやカラム、マスターデータなどの追加をする場所です。
アプリのアップデートとは必ず毎回のアップデートを適用してもらえているものではありません。
OnUpgrade メソッドではアップデート前のバージョン番号と現在のバージョン番号が渡されるようになっています。