SquiDB入門 (SQLite framework for Android)

# SquiDBとは

https://github.com/yahoo/squidb

Androidのために作られたSQLiteデータベースのフレームワークです。(参照：Wiki

... yahooさん、本当にありがとう。

# SquiDBの導入
## Submoduleとして追加する
1) AndroidStudioで適当なプロジェクトを作成. (APIは14以上で設定しておいてください）
2) SquiDBをsubmoduleとしてプロジェクトに追加する.
```
$ cd your_project
$ git init
$ git submodule add https://github.com/yahoo/squidb.git module
```
これで```module```というフォルダが自動で作成され、squidb関連のフォルダが入ったと思います。

## .gradleを修正
1. setting.gradleに各種追加. 
2. build.gradleに各種追加. 
3. app/build.gradleにandroid/packagingOptions, apt, dependenciesを各種追加.  
4. squidb関連フォルダにあるbuild.gradleを確認し、dependenciesに```compile project(':squidb')```といった記載があれば, ```compile project(':module:squidb')```というようにpathを変更.  


詳細は作成した[サンプルプロジェクト](https://github.com/gotokatsuya/squidb-example)をご覧ください..!

以上で、ビルドが出来るようになったと思います。
次はいよいよ、シンプルな使用例を書いていきますよ。

# SquiDBを使った実装
## テーブル定義
テーブル：people, カラム：name (default = "Me", not null)

```java
@TableModelSpec(className = "Person", tableName = "people")
public class PersonSpec {

   @ColumnSpec(defaultValue = "Me", constraints = "NOT NULL")
   String name;

}
```
default値や、not null制約などをAnnotationで記載できます。

className = "Person"ってなんぞや...と思っているあなた。後で説明します。

## データベース設定
```java
public class ExampleDatabase extends AbstractDatabase {

    private static final int VERSION = 1;
    private static final String NAME = "ex-database.db";
    
    public ExampleDatabase(Context context) {
        super(context);
    }

    @Override
    protected String getName() {
        return NAME;
    }


    @Override
    protected Table[] getTables() {
        return new Table[]{
                Person.TABLE,
        };
    }

    @Override
    protected int getVersion() {
        return VERSION;
    }

    @Override
    protected boolean onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        return true;
    }
}
```

AbstractDatabaseを継承して作成します。以下は必ず実装してください。

```java
String getName(); // データベースのファイル名

int getVersion(); // データベースのバージョン
                  // この値がインクリメントされると、マイグレーションが実行されます

Table[] getTables(); // データベース初期化時に、作成したいテーブルのリスト

void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion); // データベースのアップグレードをハンドリングする
```

ExampleDatabaseクラスのgetTablesメソッド内で、先ほどクラス名として定義したPersonが使われています。PersonとはPersonSpecクラスを元に、自動で作成されるクラスになります。なので、ビルドしていない状態でPerson.TABLEと書くと、普通にエラーがでます。ビルドすると怒られなくなります。安心してください。

## DatabaseDaoを使用してデータベースを操作する
```java
public class MainActivity extends ActionBarActivity {

    private DatabaseDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dao = new DatabaseDao(new ExampleDatabase(this));

        Person newPerson = new Person();
        //newPerson.setName("Sam");

        // インサートします
        dao.persist(newPerson);

        // persistをコールした後は, モデルがIDを持っているはず
        long rowId = newPerson.getId();

        fetch(rowId);
    }

    // IDからPersonを取得して名前を表示する
    private void fetch(long rowId) {
        Person person = dao.fetch(Person.class, rowId);
        Toast.makeText(this, person.getName(), Toast.LENGTH_SHORT).show();
    }

}
```
基本的なCRUD操作のサンプルは[こちら](https://github.com/yahoo/squidb/wiki/Using-DatabaseDao)にあります。

# 最後に

[本家のWiki](https://github.com/yahoo/squidb/wiki)を見ると本当にまだまだ書き足りないですが、入門ということで以上にさせていただきます。ありがとうございました！

# Links
https://github.com/yahoo/squidb
https://github.com/yahoo/squidb/wiki
https://github.com/yahoo/squidb/wiki/Using-DatabaseDao
https://github.com/gotokatsuya/squidb-example