まえがき
「Realm Xamarin」のC#の記事です。
Swiftが一番有名なので、「Realm Xamarin」と今後呼ぶことにします。
この「まえがき」は僕の愚痴に近いものなので「まえがき」は読み飛ばしてもいいです。
https://realm.io/docs/xamarin/latest/
この公式ドキュメントでハマりました。
なので自分の備忘録権、自分の理解を深めるのが目的。
If you can't explain it to a six year old, you don't understand it yourself.
6歳の子供に説明できなければ、理解したとは言えない。
アルベルト・アインシュタイン.
「ドキュメントを作る目的は、書くことでも読むことでもない。レビューすることを通じて、互いの理解の差を埋めることが目的である。」なんて2008年から言われてますのでもっとわかりやすいドキュメントを願います。
猿でもわかるとか、高慢なドキュメントとか本とか記事書く人もいますが、本当に猿とかに読ませましたか?
僕はこれ以上説明すると分かりやすすぎるドキュメントを書きますよ。
実行環境
MacBook (Retina, 12-inch, Early 2015)
Mac OS X (10.11.5 EI Capitan)
Xamarin Studio Community (Version 5.10.3)
※僕の環境なので、もし違ってたら環境を疑いましょう
Realmのインストール方法
NuGet?
Realmを使用するにはNuGetを利用してインストールします。ソースコードはGitHubにあります。
と公式ドキュメントにありますが、混乱を招くのでコレは無視しましょう。
ニセの歯車
本家のドキュメントは画像がなくてハマりますが、
「Solution」ペイン→「Packages」フォルダ→「歯車」アイコンを押下です。
「Solution」の真下にある方の歯車ではないです!
本物の歯車
早速テストのプログラム
最初に「PCLプロジェクト」を作っている前提です。
最初のコード
インポート
using Realms;
実行部分
var realm = Realm.GetInstance();
iOSとAndroidにも対応
図のようにそれぞれのPackagesで先ほどやったのと同じことをしてください。
コード
using Realms;
using System.Collections.Generic;
using System.Diagnostics; // =>Logのため.
using System.Threading.Tasks; // => Threadの代わりのTaskののため.
using System.Linq; // => LINQのため.
//using System.Threading; => Threadは使えない.
PCLプロジェクトはPCLのコードしか使えないので、System.Threading.Thread
は無いとのこと。
なので、using System.Threading;
は使えません。
しかし、公式ドキュメントには記載はない・・・。
犬のDog
クラスと人のPrson
クラスを作成。
// Define your models like regular C# classes
public class Dog : RealmObject
{
public string Name { get; set; }
public int Age { get; set; }
public Person Owner { get; set; }
}
public class Person : RealmObject
{
public string Name { get; set; }
public RealmList<Dog> Dogs { get; }
}
以下を実行しましょう。
var realm = Realm.GetInstance();
// Use LINQ to query
var puppies = realm.All<Dog>().Where(d => d.Age < 2);
Debug.WriteLine("カウント");
var cnt = puppies.Count(); // => 0 because no dogs have been added yet
Debug.WriteLine(cnt);
// Update and persist objects with a thread-safe transaction
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "Rex";
mydog.Age = 1;
});
realm.Write(() =>
{
var mydog = realm.CreateObject<Dog>();
mydog.Name = "30才の犬";
mydog.Age = 30;
});
Debug.WriteLine("カウント");
// Queries are updated in real-time
cnt = puppies.Count();
Debug.WriteLine(cnt); // => 2になるはず
// LINQ query syntax works as well
var oldDogs = from d in realm.All<Dog>() where d.Age > 8 select d;
Debug.WriteLine("爺さん犬");
foreach (var d in oldDogs)
{
Debug.WriteLine(d.Name);
}
// Query and update from any thread
// Threadは使えません!
// new Thread(() =>
new Task(() =>
{
var realm2 = Realm.GetInstance();
var theDog = realm2.All<Dog>().Where(d => d.Age == 1).First();
realm2.Write(() => theDog.Age = 3);
}).Start();
Thread
は使えません、代わりにTask
を使用します。
ドキュメントの注意
Realmオブジェクトに対するすべての変更(追加、変更、削除)は、トランザクションの内部で行う必要があります。
ログを見る
Debug.LogWrite
はusing System.Diagnostics;
はusing
していないといけないですね。
Androidのときはadb
コマンドで見るXcodeはまだ不明。
Xamarinで直接ログを出してくれない。
~/Library/Developer/Xamarin/android-sdk-macosx/platform-tools/adb
にだいたい入っているはず。
zshrcではこのように設定しておくのが吉。
export PATH="/Users/ユーザ名/Library/Developer/Xamarin/android-sdk-macosx/platform-tools:$PATH"
実際にこのコマンドでログを見る
adb logcat
あとがき
「分かりにくいぞ、もっと説明しろ」ってのがあればコメント欄へ。
質問あればコメント欄へ。
誤字・脱字があれば「編集リクエスト」で。
ここが参考になるかと思います。