はじめに

Android 開発をしていてアプリ内に DB を設けることは多々あると思いますが、Android 標準の SQLite を使用すると非常に面倒なうえに、 妙にややこしいせいで思わぬバグを呼んでしまうこともあるかと思います。

その打開策として、ライブラリに任せて直感的に実装を進めていくわけですが、様々なライブラリの中でどれを選択すれば良いのか迷うこともあるのではないでしょうか?

今回はそういった方のために、どのライブラリを使用すべきか、 使いやすいものはどれか、初心者ならどれが使いやすいか。

などの観点で、ライブラリの特徴や使い方についてまとめてみました。

紹介するライブラリ

今回紹介するライブラリは以下の 4 つになります。

  • ActiveAndroid
  • SquiDB
  • Orma
  • Realm

これらに関して、簡単な使い方や概要を説明していきます。

ActiveAndroid

ActiveAndroid は、コピーライトにもあるように 2010 年から開発が進んでいる歴史あるライブラリです。 最終更新は 2014 年なのでちょっと古くなってしまってるかもしれませんが、調べてみると色々なページに情報が転がっていて、何か困ったときには助けになってくれそうなライブラリです。

導入

build.gradle に以下の設定を付け足すことで導入できます。

repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}


dependencies {
    compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
}

また、ActiveAndroid を使用するために AndroidManifest.xml もしくは独自に作成した Application クラスの中で初期化を行う必要があります。

AndroidManifest.xml にて初期化する場合の例は以下の様になります。


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

AA_DB_NAME に保存するデータベースの名前、AA_DB_VERSION にデータベースのバージョンを設定できます。 これを書いておくことでアプリ起動時にデータベースの初期化処理が動くようになります。

しかし、すでに独自の Application クラスを持っていたり、他のライブラリで同様にApplication クラスを継承した独自 Application クラスを持っている場合には、 Manifest だけで管理することはできないこともあります。

その時は以下のようにするのが良いでしょう。


public class MyApplication extended Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ActiveAndroid.initialize(this);
    }
    @Override
    public void onTerminate() {
        super.onTerminate();
        ActiveAndroid.dispose();
    }
}


使い方

ActiveAndroid でテーブルを作成する場合は、Model のサブクラスを作成します。 後は要素やテーブル名をアノテーションを使用して指定することでアプリ起動時に作成してくれます。

@Table(name = "Items")
public class Item extends Model {
        // If name is omitted, then the field name is used.
        @Column(name = "Name")
        public String name;

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

        public Item() {
                super();
        }

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

テーブル名は @Table と言うアノテーションを、テーブルの要素には @Column というアノテーションをそれぞれ使用します。

この様に、ActiveAndroid は比較的シンプルに DB を構築・使用することができると思います。 ちょっと更新が止まってしまっているのが気になりますが、簡単な DB を作成する場合には問題ないでしょう。

SquiDB

SquiDB は、yahoo が公開している SQLite database 用のライブラリです。 生の SQL をいじるときの強さと柔軟性を可能にしたまま、できるだけ楽に SQLite を使えるように設計されています。

導入

SquiDB を使用するためには、Java Annotation Processing Tool と言うものを導入しなくてはいけません。 そのためにこのはグレイドルプラグインを使用することをオススメします。

実際に導入するための build.gradle ファイルは以下のようになります。

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        ...
    }
}

repositories {
    jcenter()
}

apply plugin: 'com.neenbedankt.android-apt'

dependencies {
    compile 'com.yahoo.squidb:squidb:3.1.2'
    compile 'com.yahoo.squidb:squidb-annotations:3.1.2'
    compile 'com.yahoo.squidb:squidb-android:3.1.2'
    apt 'com.yahoo.squidb:squidb-processor:3.1.2'
}

使い方

SquiDB はテーブルをオブジェクトとして表します。 SquiDatabase オブジェクトは、データベースからの読み書きをオブジェクトを使用し仲介してくれます。 これらのコンポーネントを設定していると、迅速かつ簡単にDBを使用することが可能です。

例としては以下になります。


// This is a table schema
@TableModelSpec(className = "Person", tableName = "people")
class PersonSpec {

    // A text column named "firstName"
    String firstName;

    // A text column named "lastName"
    String lastName;

    // A long column named "creationDate", but referred to as "birthday"
    // when working with the model
    @ColumnSpec(name = "creationDate")
    long birthday;
}

// This is how you'd set up a database instance
public class MyDatabase extends SquidDatabase {

    private static final int VERSION = 1;

    public MyDatabase() {
        super();
        // Any other initialization of the instance
    }

    @Override
    public String getName() {
        return "my-database.db";
    }

    @Override
    protected Table[] getTables() {
        return new Table[]{
            // List all tables here
            Person.TABLE,
        };
    }

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

    // Other overridable methods exist for migrations and initialization;
    // omitted for brevity
}

MyDatabase db = new MyDatabase(); // Important: db instances should always be singletons

// This is how you'd work with the generated model
Person newPerson = new Person()
    .setFirstName("Sam")
    .setLastName("Bosley")
    .setBirthday(System.currentTimeMillis());
db.persist(newPerson);

...

String firstName = newPerson.getFirstName();
String lastName = newPerson.getLastName();
long birthday = newPerson.getBirthday();


こちらは比較的新しいライブラリのため、日本語の記事はあまりありません。ですが最近も更新され続けているフレッシュなライブラリなので、情報を追っていくのが良いと思います。

Orma

Orma は 2015 年 から日本で開発されている Android SQLiteDatabase の ORM ライブラリです。 ActiveAndroid のように簡単で GreenDAO のように高速な ORM を目指して開発しているそうです。

導入

Annotation processing を使用しているため、android-apt プラグインが必要になります。そのためまずは以下の設定を行います。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'

次に使用するプロジェクトの build.gradle ファイルに以下の設定を追加すれば使えるようになります。


dependencies {
    apt 'com.github.gfx.android.orma:orma-processor:2.+'
    compile 'com.github.gfx.android.orma:orma:2.+'
}

使い方

スキーマの定義は、モデルクラスを @Table と @PrimaryKey 、 @Colum アノテーションで注釈します。 この時 @Colum アノテーションはデフォルトで not null の設定になるので Null を許容する場合には @Nullable アノテーションを追加する必要があります。

ちなみにモデルのための特別なベースクラスはなく、任意のクラスを拡張することができます。 この時条件としては以下のいずれかになります。

  • 空の public コンストラクタがあること
  • カラムの全てを受け取るコンストラクタがあること(この場合 @Setter の付加が必要)

例としては以下のようになります。

@Table
public class Todo {

    @PrimaryKey
    public long id;

    @Column(indexed = true)
    public String title;

    @Column
    @Nullable // allows NULL (default: NOT NULL)
    public String content;

    @Column
    public long createdTimeMillis;

    @Setter
    public Todo(long id,String title,String content,long createdTimeMillis){/* ... */}
}

ActiveAndroid のような容易さを求めて作成されたというだけあり、すごくシンプルな作りになっています。 最近でも更新は続いているため、今からライブラリの導入を考えるならこちらのほうが良いのかもしれませんね。

Realm

Realm とは SQLite & Core Date を置き換えるために作られた Mobile 向けの DataBase です。 元々は iOS 向けに作成されていましたが、コードが C++ で書かれていたため Android でも使用可能になっています。

オープンソースになっているため、どういう実装になっているのか確認することもできます。

導入

Realm を使用するには以下必要条件があります。

  • Android 以外の Java はサポートされていません
  • バージョン 1.5.1 以上の Android Studio が必要です
  • 最新の Android SDK が使えます
  • JDK 7 以降を必要とします
  • API Levlel は 9 (Android 2.3) からサポートしています

これを踏まえたうえで Realm を使用するには、 Gradle プラグインをプロジェクトに適用する必要があります。 適用のためのステップは 2 つあります。

  1. プロジェクトのトップレベルにある build.gralde ファイルに設定

    build.gradle ファイルに以下の classpath を追加します

    buildscript {
        repositories {
            jcenter()
        }
        dependencies {
            classpath "io.realm:realm-gradle-plugin:2.0.2"
        }
    }
    
  2. realm-android プラグインをアプリケーションレベルにある build.gradle ファイルで適用

    以下の設定を build.gradle ファイルに追加します。

    apply plugin: 'realm-android'
    

これら設定を行った後にプロジェクトをリフレッシュすることで Realm を使用することが可能になります。

使い方

Realm では、RealmObject のサブクラスを作成することでモデルを定義します。コードは以下のようになります。

public class User extends RealmObject {

    private String          name;
    private int             age;

    @Ignore
    private int             sessionId;

    // Standard getters & setters generated by your IDE…
    public String getName() { return name; }
    public void   setName(String name) { this.name = name; }
    public int    getAge() { return age; }
    public void   setAge(int age) { this.age = age; }
    public int    getSessionId() { return sessionId; }
    public void   setSessionId(int sessionId) { this.sessionId = sessionId; }
}

また、モデル定義では public、protected、private フィールドや、任意のメソッドを使用することも可能になっています。

このように Realm もシンプルに使用することのできる DataBase ですが、ここまで紹介してきた 3 つとは違い SQLite ベースの DB ではありません。

まとめ

いかがでしたでしょうか。 基本的に触りの部分の説明をしたので、これだけではどのライブラリを選択するか決められないかもしれません。しかし、選択のための指標になってくれれば幸いかと思います。

個人的には、使い勝手や情報の多さなどから Orma か Realm を使用するのが良いのではないかと思います。