Realm React Nativeをリリースしました! 詳しくはリリースのお知らせをご覧ください。
Realmは、SQLiteやCoreDataから置き換わるモバイルデータベースです。

Realm React Nativeを公開

簡単に使えて高速なデータベース: ライブオブジェクト、変更通知イベント、一方向データフローをサポート

本日のFacebook React.jsカンファレンスにおいて、React Native向けのRealmデータベースを新たに公開いたしました。使いやすいAPIによるオブジェクトの永続化とフル機能のクエリを、他のライブラリに対して2倍から10倍の速度で提供します。

他の言語向けのRealmと同様、使いごこちの良いアプリケーションの開発を可能にするためReact Native向けに設計されたもので、ライブオブジェクト変更通知イベント一方向のデータフローをサポートします。

React Native版のコードは以下のようになります。

const Realm = require('realm');

class Person {}
Person.schema = {
    name: 'Person',
    primaryKey: 'name',
    properties: {
        name: 'string',
        age: {type: 'int', default: 0},
    },
};

const realm = new Realm({schema: [Person]});

// 問い合わせ
let people = realm.objects('Person', 'age >= 17');
people.size // => 0

// 書き込み
realm.write(() => {
    savedPerson = realm.create('Person', {
        name: 'Hal Incandenza',
        age: 17,
    });
});

// 問い合わせ結果は自動的に更新されます
people.size // => 1

Realm はモバイルアプリケーションのために作り上げられたデータベースであり、携帯電話、タブレット、ウエアラブル端末上で動作します。2014年以来RealmはJava版、Objective-C版、Swift版をリリースし、LINE、Yahoo、サイバーエージェント、Wantedly、日経新聞、Sansan、マネーフォワード、Starbucks、Cisco、Walmart、Google、Amazon、eBayをはじめとするさまざまな企業のアプリケーションに利用され、数億台のデバイスで稼働しています。

本日、Facebook社が提供するJavaScriptフレームワークでありiOSおよびAndroidのネイティブアプリケーションの作成を可能にするReact Nativeへの対応を開始したします(React Native であり、Reactフレームワーク全体への対応ではないことにご注意ください)。

Realm React Native は先進的な設計と簡潔さをアプリケーションにもたらし、単一のコードベースでiOSとAndroidの両方に対応することを可能にします。本日一般公開されるRealm React Nativeではありますが、Realm React Nativeは2ヶ月以上前からTaskRabbitのプロダクトコードで使用されています

Realmについて

RealmはSQLite上に構築されたいわゆるORMではありません。我々はモバイルアプリケーションのために1からデータベースを開発しています。そのため、単なるキーバリューストアでではなく、データベースエンジンが保持するデータに動的に対応付けられたネイティブなJavaScriptオブジェクトを提供します。このことにより、Realmは簡潔なAPIとパフォーマンスの両立を達成しています。Realmを用いることで、複雑なデータのモデリング、オブジェクト間のリンク、高度なクエリのすべてが可能となります。

class Dog {}
Dog.schema = {
    name: 'Dog',
    properties: {
        name: 'string',
        age: 'int',
    }
};

let realm = new Realm({schema: [Dog]});

realm.write(() => {
    realm.create('Dog', { name: 'Rex', age: 3 });
});
// 基本的なクエリ
let r = realm.objects('Dog').filtered('age < 8');

// クエリの連鎖
let r2 = r.filtered('name contains "Rex"');
r2.size // => 1

realm.write(() => {
    realm.create('Dog', { name: 'Rex Maximus', age: 4 });
});

// 結果は自動的に更新されます
r2.size // => 2
class Person {}
Person.schema = {
    name: 'string',
    dogs: {type: 'list', objectType: 'Dog'},
};

let realm = new Realm({schema: [Dog, Person]});

realm.write(() => {
    let person = realm.create('Person', {
        name: 'Tim',
        dogs: [{name: 'rex', age: 3}],
    });
});

APIの使用方法に関するさらなる例はサンプルプロジェクトや、テストコードを参照してください。

Realmを使うべき理由

使い方が簡単

上記のサンプルコードを見ていただければ分かる通り、Realmは使いやすさを最も重視しています。これはRealm React Nativeでも変わりありません。使いやすさにつづき、以下の点についても他のプロダクト同様注力しています。

速い!

Realmの使いやすさはパフォーマンスを犠牲にしません。メモリマッピング、遅延ローディング、独自のストレージエンジンなどにより、RealmはリッチなオブジェクトベースのAPIを提供しているにもかかわらず、通常SQLiteやAsyncStorageよりも高速に動作します。それぞれのユースケースでの確認を行うことをおすすめしていますが、多くの場合既存のコードをRealmに対応させることで大幅な高速化を達成できます。詳細はベンチマーク結果を参照してください。

クロスプラットフォーム

Realm React NativeのAPIはJavaScriptで記述できるので、iOSとAndroidの両方を対象とすることができます。さらに、Realmのデータベースファイルフォーマットは完全にクロスプラットフォーム対応なので、iOSとAndroid間で簡単に同じファイルを使用することができます。デバッグの際は、Realm Browserを用いてファイルの中身を確認することができます。

先進的

Realmオブジェクトはつねに最新の状態に維持され、そのことがリアクティブパターンや一方向データフローを当たり前のものにします。リンクの機能はグラフ構造のRealmオブジェクトの扱いを可能にし、クエリ言語により任意のプロパティの組み合わせに対してクエリを発行することができます。また、Realmのデータを簡単にReact Native ListViewに表示させることができます。

信頼性

Realm React Nativeは世界中の数億のユーザーに利用されているRealm Java、Objective-C、Swiftと同じエンジンの上に構築されています。これらはeコマースアプリケーション、銀行のアプリケーション、ヘルスケア分野、さらには政府機関のアプリケーションにも採用され、高い信頼を獲得しています。Realm React NativeはすでにTaskRabbitの公式なアプリケーションで昨年の12月から使用されています

コミュニティドリブン

Realm React Nativeは、GitHub上で開発が行われています。機能はユーザーの要求に応じて優先順位付けされます。また、コードへのコントリビューションも歓迎しています。

サポート

Realmはサポートとバグフィックスを他のすべてのタスクよりも優先します。そのため、データベースに関する質問には直接その開発やメンテナンスを行っている開発者から回答を得ることができます。 質問はSlack(日本語)Twitter(日本語)StackOverflow(日本語)GitHub(英語)で受け付けています。

テストは2016年2月19日時点の最新版のRealm、SQLiteはReact Native SQLite Storageを、AsyncStorageはReact Native Storeを使用しています。また、測定はiPhone 6S(iOS 9.2.1)とNexus 9(Android 5.0.1)上でベンチマークプログラムにより行っています。

今後について

本日のRealm React Nativeが提供する機能は、Realm Java、Objective-C、Swiftが現在提供している機能とくらべると若干不足している部分があります。しかし、TaskRabbitの例のように、実際にプロダクトに投入するレベルの信頼性をすでに獲得しているのも事実です。我々が今後どのようにRealm React Nativeを進化させていくべきかについて、みなさんのフィードバックを必要としています。バグレポートや機能追加リクエストをGithubにお寄せください。APIに関しては、今後数週間の間に大きく改善される予定です。特に現状不足しているマイグレーション関連やクエリ関連に注力します。

もしJavaScriptは使用しているがReact Nativeは使用していないという場合であってもがっかりしないでください。今後、Cordova/PhoneGap/Ionicのサポートを計画しています。さらにはNode.js(V8)互換性も将来的には視野に入れています。

Realmがどのようなプロダクトに使われることになるのか、我々はとても楽しみにしています。

TaskRabbitとReact Nativeチームのサポートに大変感謝しています。彼らのフィードバックのおかげでRealm React Nativeはとても素晴らしい物になりました。また、Realm React NativeをReact Conf 2016で発表できることを大変光栄に思っています!