tsurutanのつぶやき

これが、破壊的イノベーションだっっっ!!

スポンサーリンク

広告

Android Realmを使ったデータベース管理 【入門】

f:id:tsurutan:20161005115826j:plain

今回はRealmについて説明したいと思います。

Realmとは簡単いいうとクエリーなどデータベースにアクセスした時にレスポンスが早いラッパーです。

f:id:tsurutan:20161005115743p:plain

既存のデータベースエンジンを単にバインディングしたものではなく、ゼロベースで作り出された独自のエンジンを内部に持っています。

RealmはそのエンジンをObjective-CやSwift、Android Java から容易に使用できるようにラッパーしたものであり、バインディング部分のほぼ全てはオープンソースで公開されています。

使い方

まずRealmを使用するためには、そのモデルクラスを作成しなくてはいけません。 今回は猫のクラスを作ってみましょう。

f:id:tsurutan:20161005120359j:plain

猫には名前と歳があるので、それぞれnameage変数を作ります。

またRealmではそれらの変数にアクセスするためgetterとsetterを準備しましょう。

// RealmObjectを継承することでモデルクラスを定義
public class Cat extends RealmObject {
    private String name;
    private int age;

    // getterとsetterを生成
}

また猫には飼い主がいますので、そのクラスも作っちゃいましょう。

まず名前と歳を先ほどと同じように加え、次に人は同じ名前や年齢の人がたくさんいますのでそれを区別するために idというものをつけましょう。

idは必ず一人ずつ独自のものを持っており、そのような場合には@PrimaryKeyを変数の上に書きます。

そして飼い主は猫を飼っているのでCat変数を作りたいのですが、複数の猫を飼っている場合があります。

そのような時にRealmList<Cat>を使うことで、catsは可長なリスト変数になるため猫を際限なく飼うことができるのです。

public class Person extends RealmObject {
    @PrimaryKey
    private long id;
    private String name;
    private int age;
    private RealmList<Cat> cats; // 1対多の関連をもつ

    // 生成されたgetterとsetter
}

さてこれで一通り、猫と飼い主の準備が終わったので次にトランザクション処理について説明したいと思います。

まず、realmインスタンスをつくるため下記のようにコードを書きます。

// アプリケーションの"files"ディレクトリにRealmファイルを作成するRealmConfigurationを作成
RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();
Realm.setDefaultConfiguration(realmConfig);
// このスレッドのためのRealmインスタンスを取得
Realm realm = Realm.getDefaultInstance();

はい、これで準備は整いました。 それでは先ほど、作成したcatをデータベースに保存してみましょう。 まず、普通のインスタンスをつくるようにnewを使ってcat変数に代入します。 その後、setterに名前と年齢を渡します。

// 通常のJavaオブジェクトのようにモデルクラスを使用
Cat cat = new Cat();
cat.setName("Rex");
cat.setAge(1);

そして次がトランザクション処理です。

realm.beginTransaction()と書くことでトランザクション処理が開始します。

そして、その後に先ほど作ったcatクラスをrealmが管理できる状態にします。

そしてPersonにcatをaddさせた後、realm.commitTransaction()を書くことでトランザクションが終了し処理中に書かれた内容がデータベースに反映されます。

// トランザクションの中でデータを永続化します
realm.beginTransaction();
final Cat managedCat = realm.copyToRealm(cat); // unmanagedなオブジェクトを永続化
Person person = realm.createObject(Person.class); // managedなオブジェクトを直接作成
person.getCats().add(managedDog);
realm.commitTransaction();

また、データーベースからデータを呼び出すときは、先ほど作成したrealmインスタンスからおなじみのSQLを使ってアクセスすることができます。

// 年齢が2未満のすべてのDogオブジェクトを取得する問い合わせを発行
final RealmResults<Cat> cats = realm.where(Cat.class).lessThan("age", 2).findAll();
cats.size(); // => まだRealmへは一つもオブジェクトが保存されていないので0を返します

とても簡単ですね!

どうやって使うの?

プロジェクトのトップレベルにあるbuild.gradle

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:1.1.0"
    }
}

と記述します。

そしてアプリケーションレベルのbuild.gradle

apply plugin: 'realm-android'

と書きます。これで終わりです!!

所感

昔はSQLiteなどを使ってゴリゴリ書いていたのですが、Realmなどのラッパーの登場でだいぶコードが簡潔に書けるようになってきました。

Realm自体最近ホットで開発がどんどん進んでいるのでかなり期待です。

ただ、ややデメリットとして考えられるのはマイグレーション処理が少し面倒なことです。(昔と比べたらだいぶ楽ですが)

データーベース周りは初心者が取っ付きにくいところでもあると思うので、こんなに簡単にできるんだぞ!ということが伝わっていただければ幸いです。

ほんきで学ぶAndroidアプリ開発入門 第2版 Android SDK 7/Android Studio 2.X対応

ほんきで学ぶAndroidアプリ開発入門 第2版 Android SDK 7/Android Studio 2.X対応

黒帯エンジニアが教えるプロの技術 Android開発の教科書 (ヤフー黒帯シリーズ)

黒帯エンジニアが教えるプロの技術 Android開発の教科書 (ヤフー黒帯シリーズ)

  • 作者: 筒井俊祐,里山南人,松田承一,笹城戸裕記,毛受崇洋
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2016/06/18
  • メディア: 単行本
  • この商品を含むブログを見る

スポンサーリンク

広告