ActiveAndroid Android/JavaでActive Record風にSQLiteを使う


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


🚜 前提

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

😀 jarファイルの生成

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

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

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

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

🐯 Gradleファイルの設定

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

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 を追記。

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

<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>

🍄 テーブル定義の設定

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

// テーブル名の定義
@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文。かなり直感的。

// Itemテーブルのレコードを作成
Item item = new Item();
item.name = "Outback Steakhouse";
// 作成したレコードを保存
item.save();

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

Creating your database model · pardom/ActiveAndroid Wiki

🚌 レコードの検索

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

// 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型に戻してくれるクラスを作ります。

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に次の設定を追加!

<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…

🐮 参考リンク

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

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍