Realm Xamarinを公開!
本日、Xamarin向けの新たなRealmモバイルデータベースを公開いたしました。オブジェクトの永続化とフル機能のクエリをサポートしたデータベースでありながら既存のものよりも高速に動作します。
他の言語向けのRealmと同様、reactiveなアプリの開発のために設計されたもので、ライブオブジェクト、 変更通知イベント、一方向のデータフローをサポートしています。
public class Dog : RealmObject
{
public string Name { get; set; }
public int Age { get; set; }
public Person Owner { get; set; }
}
var realm = Realm.GetInstance();
// LINQでクエリを発行
var puppies = realm.All<Dog>().Where(d => d.Age < 2);
puppies.Count(); // => 0(オブジェクト未作成なので)
// トランザクションを用いて書き込み
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "Rex";
mydog.Age = 1;
});
// クエリの結果はリアルタイムに更新されます
puppies.Count(); // => 1
Realm はモバイルアプリケーションのために作り上げられたデータベースであり、携帯電話、タブレット、ウエアラブル端末上で動作します。2014年にJava版、Objective‑C版、Swift版をリリースし、2016年初頭にはReact Nativeをリリースしています。
これまでLINE、Yahoo、サイバーエージェント、Wantedly、日経新聞、Sansan、マネーフォワード、Starbucks、Cisco、Walmart、Google、Amazon、eBayをはじめとするさまざまな企業のアプリケーションに利用され、数億台のデバイスで稼働しています。
本日、Microsoft社が提供するモバイル向けのフレームワークであり、C#のコードでネイティブのiOS/Androidアプリ開発を可能にするXamarin向けのRealmを公開いたします。
Realm Xamarin は先進的な設計と簡潔さをアプリケーションにもたらし、単一のコードベースでiOSとAndroidの両方に対応することを可能にします。当初サポートするのはXamarin.iOSおよびXamarin.Androidですが、将来的にはXamarin.Mac、UWP、Unityのサポートも行っていきたいと考えています。
What is Realm?
RealmはSQLite上に構築されたいわゆるORMではありません。我々はモバイルアプリケーション開発者のために1からデータベースを開発しています。そのため単なるキーバリューストアではなく、データベースエンジンが保持するデータに動的に対応付けられたネイティブなC#オブジェクトを提供します。このことにより、Realmは簡潔なAPIとパフォーマンスの両立を達成しています。Realmを用いることで、複雑なデータのモデリング、オブジェクト間のリンク、高度なクエリのすべてが可能となります。
public class Dog : RealmObject
{
public string Name { get; set; }
public int Age { get; set; }
public Person Owner { get; set; }
}
var realm = Realm.GetInstance();
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "Rex";
mydog.Age = 9;
});
// LINQによるクエリ
var oldDogs = realm.All<Dog>().Where(d => d.Age > 8);
// or
var oldDogs = from d in realm.All<Dog>() where d.Age > 8 select d;
// クエリは連鎖可能
var dogsNamedRex = oldDogs.Where(p => p.Name == "Rex");
dogsNamedRex.Count(); // => 1
// 変更はスレッドセーフなトランザクション内で実行します
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "Rex Maximus";
mydog.Age = 10;
});
// クエリの結果はリアルタイムに更新されます
dogsNamedRex.Count(); // => 2
public class Person : RealmObject
{
public string Name { get; set; }
public RealmList<Dog> Dogs { get; }
}
var realm = Realm.GetInstance();
var jim = realm.CreateObject<Person>();
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "Fido";
mydog.Owner = jim;
});
APIの使用方法に関するさらなる例はサンプルアプリを参照してください。
Realmを使うべき理由
使い方が簡単
上記のサンプルコードを見ていただければ分かる通り、Realmは使いやすさを最も重視しています。これはRealm Xamarinでも変わりありません。使いやすさにつづき、以下の点についても他のプロダクト同様注力しています。
速い!
Realmの使いやすさはパフォーマンスを犠牲にしません。メモリマッピング、遅延ローディング、独自のストレージエンジンなどにより、RealmはリッチなオブジェクトベースのAPIを提供しているにもかかわらず、通常SQLiteよりも高速に動作します。それぞれのユースケースでの確認を行うことをおすすめしていますが、多くの場合既存のコードをRealmに対応させることで大幅な高速化を達成できます。詳細はベンチマーク結果を参照してください。
クロスプラットフォーム
Realm XamarinのAPIはC#で記述され、iOSとAndroidの両方を対象とすることができます。さらに、Realmのデータベースファイルフォーマットは完全にクロスプラットフォーム対応なので、iOSとAndroid間で簡単に同じファイルを使用することができます。デバッグの際は、.realm
ファイルの中身をRealm Browserを用いて確認することができます。
先進的
Realmオブジェクトはつねに最新の状態に維持され、そのことがリアクティブパターンや一方向データフローを当たり前のものにします。リンクの機能はグラフ構造のRealmオブジェクトの扱いを可能にし、LINQにより任意のプロパティの組み合わせに対してクエリを発行することができます。また、Realmのデータを簡単にXamarin.Formsに統合することができます。
信頼性
Realm Xamarinは世界中の数億のユーザーに利用されているRealm Java、Objective‑C、Swiftと同じエンジンの上に構築されています。これらはeコマースアプリケーション、銀行のアプリケーション、ヘルスケア分野、さらには政府機関のアプリケーションにも採用されています。
コミュニティドリブン
Realm Xamarinは、GitHub上で開発が行われています。機能はユーザーの要求に応じて優先順位付けされます。また、コードへのコントリビューションも歓迎しています。
サポート
Realmはサポートとバグフィックスを他のすべてのタスクよりも優先します。そのため、データベースに関する質問には直接その開発やメンテナンスを行っている開発者から回答を得ることができます。 質問はSlack(日本語)、Twitter(日本語)、StackOverflow(日本語)、GitHub(英語)で受け付けています。
テストは2016年5月9日時点の最新版のRealm、sqlite-net、Couchbase Liteを使用しています。また、測定はiPhone 6S Plus 128GB上にiOS 9.3.1がインストールされた端末で行っています(ソースコード)。ベンチマークはおおまかな目安なので、ユースケースに合わせた測定を各自で行うことをおすすめします。
今後について
ぜひ改善に関するフィードバックをお寄せください。バグレポートや機能のリクエストはGitHubリポジトリで受け付けています。今後数週間の間APIの改善を進めてまいりますが、特にマイグレーションやクエリに関するAPIの改善に力を入れていきます。
.NETを使用していてUWPサポートやUnity サポートが必要な方は、ぜひこれらのissueにご意見をお寄せください。
Realmがどのようなプロダクトに使われることになるのか、我々はとても楽しみにしています。