HUSKING - kotteri

技術系Note

【XAMARIN】SQLiteを試す

データの永続的な保存方法として、SQLiteを使用してみた。

<注意>自分は今回以下のように使用しただけで、本当に使い方が合ってるかは分かりかねます


使用準備

NuGetから「sqlite-net-pcl」をインポートするだけ

テーブル用のクラスを作成

using System;
namespace SimpleMemo
{
    public class CategoryTable
    {
        [SQLite.PrimaryKey, SQLite.AutoIncrement]
        public int Id { get; set; }
        public string Key { get; set; }
    }
}

CategoryTable というテーブルを作成。
[Id]というカラムをプライマリキーにし、自動採番するようにしてます。

SELECT

string database = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "SimpleMemo.db");

using (var db = new SQLite.SQLiteConnection(database)
{
    // テーブル作成(何度呼び出しても問題なし。すでに作成されている場合はCreateTableは走らないらしい)
    db.CreateTable<CategoryTable>();

    // カテゴリテーブルのデータを全て取得(ID順)
    List<CategoryTable> row = db.Table<CategoryTable>().OrderBy(x => x.Id).ToList();
}

C#だとLinqが使えて凄く便利!

UPDATE

using (var db = new SQLite.SQLiteConnection(database)
{
    // Id = 1のレコードを取得
    CategoryTable row = db.Table<CategoryTable>().SingleOrDefault(x => x.Id == 1);

    // 更新
    if (row != null)
    {
        row.Key = "ざまりん";
        db.Update(row);
    }
}

直にUPDATE文を書いた方がSQL一回で済むし、処理的には速そう

DELETE

using (var db = new SQLite.SQLiteConnection(database)
{
    // Id = 1のレコードを取得
    CategoryTable row = db.Table<CategoryTable>().SingleOrDefault(x => x.Id == 1);

    // 削除
    if (row != null)
    {
        db.Delete<CategoryTable>(row.Id);
    }
}

このやり方が良いのかは凄く微妙・・・

INSERT

using (var db = new SQLite.SQLiteConnection(database)
{
    // 追加
    db.Insert(new CategoryTable
    {
        Key = "ざまりん"
    });
}


ここで凄く悩んだことが一つ!!
INSERTで自動採番したIDを取得したいと思ったのですが、良い方法が見つからず。。。
結局、INSERT後に、以下のSQLを実行して取得してます。

// 一番新しい行を取得
CategoryTable lastData = db.Query<CategoryTable>("SELECT * FROM CategoryTable ORDER BY rowid desc limit 1").Single();

// ID取得
int id = lastData.Id;

もっと良い方法があるはず!!
どなたか教えていただけると嬉しいです。。。