酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

ActiveAndroid Android/JavaでActiveRecord風にsqliteを使う

AndroidのsqliteをActiveRecord風に使うためのライブラリ 『ActiveAndroid』のインストールに手こずったのでそのメモです。 インストールさえ完了すれば、かなりわかりやすいライブラリなのでこれから重宝しそうです^^


前提

Android 4.4 / Android Studioで開発中です。

jarファイルの生成

以下のコマンドを実行してjarファイルを生成。

1
2
3
git clone https://github.com/pardom/ActiveAndroid.git
cd ActiveAndroid
sh gradlew build

生成したjarファイルをapp/libsにコピー。

1
cp ActiveAndroid/build/libs/* /android/path/to/app/libs

Gradleファイルの設定

app/build.gradleの中に以下を追加。

1
2
3
4
dependencies {
  # ↓ この行を追加
  compile 'com.android.support:appcompat-v7:+'
}

AndroidManifest.xmlに設定

AndroidManifest.xmlに次の設定を行います!

(1) applicationタグに android:name="com.activeandroid.app.Application" を追記。
(2) applicationタグの中にmeta-tagに AA_DB_NAME と AA_DB_VERSION を追記。

ということでサンプルはこんな感じです。

1
2
3
4
5
6
7
8
<manifest ...>
  <application android:name="com.activeandroid.app.Application" ...>

    <meta-data android:name="AA_DB_NAME" android:value="application.db" />
    <meta-data android:name="AA_DB_VERSION" android:value="1" />

  </application>
</manifest>

テーブル定義の設定

まずはテーブル定義を設定。これはシンプル!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// テーブル名の定義
@Table(name = "Items")
public class Item extends Model {
  // フィールドの定義
  @Column(name = "Name")
  public String name;

  @Column(name = "Category")
  public Category category;

  // コンストラクタの定義
  public Item(){
    super();
  }

  public Item(String name, Category category) {
    super();
    this.name = name;
    this.category = category;
  }
}

さらにテーブル間のリレーションの定義とかは本家GitHubのWikiがわかりやすいのでオススメです!

Creating your database model · pardom/ActiveAndroid Wiki

レコードの新規作成して保存(insert)

新規レコードを作成して保存するinsert文。かなり直感的。

1
2
3
4
5
6
// Itemテーブルのレコードを作成
Item item = new Item();
item.name = "Outback Steakhouse";

// 作成したレコードを保存
item.save();

テーブル間のリレーションを設定して保存したり、Bulk insertしたり、レコードを削除したりは本家GitHubのWikiに詳しく書いてあります。

Creating your database model · pardom/ActiveAndroid Wiki

レコードの検索

テーブルに保存したレコードを検索する場合はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// nameの一致するレコードを1件取得
public static Item getItemByName(String name) {
  return new Select()
    .from(Item.class)
    .where("Name = ?", name)
    .executeSingle();
}

// List形式で複数件のレコードを取得
public static List<Item> getAllByName(String name) {
  return new Select()
    .from(Item.class)
    .where("Name = ?", name)
    .orderBy("Name ASC")
    .execute();
}

Date型をつかえるようにする / Type serializers

sqliteで扱えるのは、INTEGER, REAL, TEXT, BLOBだけだそうです。 ですが、Date型を保存したいことって結構あると思います。そんな時に便利なのが、TypeSerializerです。

ここでは、Date型をDBに保存するときにはLong型にして、DBから取り出したらDate型に戻してくれるクラスを作ります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import com.activeandroid.serializer.TypeSerializer;
import java.util.Date;

final public class UtilDateSerializer extends TypeSerializer {
  @Override
  public Class<?> getDeserializedType() {
    return Date.class;
  }

  @Override
  public Class<?> getSerializedType() {
    return Long.class;
  }

  @Override
  public Long serialize(Object data) {
    if (data == null) {
      return null;
    }

    return ((Date) data).getTime();
  }

  @Override
  public Date deserialize(Object data) {
    if (data == null) {
      return null;
    }

    return new Date((Long) data);
  }
}

作成が完了したら、AndroidManifest.xmlに次の設定を追加!

1
2
3
4
5
6
7
8
<manifest ...>
  <application android:name="com.activeandroid.app.Application" ...>

    // ↓ 追加する行
    <meta-data android:name="AA_SERIALIZERS" android:value="パッケージ名.UtilDateSerializer" />

  </application>
</manifest>

更に使いこなすために

Creating your database model · pardom/ActiveAndroid Wiki

ActiveAndroid を使って ActiveRecord ライクに SQLite を操作する

ActiveAndroidを使ってみた - kurobaraのブログ

Android Studioで原因不明のエラーが出続ける場合

Eclipseは使ったことないですが、Android StudioでBuildすると結構な確率でエラーが出て積むことがあります。 そんな、初心者な方のために今日覚えたコマンドを書いておきます。

(1) File ----> Invalidate caches/restart
(2) Build -> Clean project

かなりハマりましたorz…

Special Thanks

How to add ActiveAndroid ORM to Gradle?

Android app has error: Execution failed task’:app:preDexDebug’ trying to test parse but can’t run app with this error | Treehouse Forum

おすすめの書籍