これ以上説明すると分かりやすすぎるRealmをXamarinで動かす方法

# まえがき

「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」の真下にある方の歯車ではないです！

<img width="307" alt="Screen Shot 2016-06-07 at 12.41.55 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/a7df5990-5c09-09e0-12b3-28c3892baef5.png">


## 本物の歯車

この歯車です。「Add Packages...」を選択。
<img width="424" alt="Screen Shot 2016-06-09 at 8.39.10 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/4b6e7c59-e093-4146-c77e-4464b32211a8.png">

## 早速テストのプログラム

最初に「PCLプロジェクト」を作っている前提です。

## 最初のコード

### インポート
```csharp:DogTest.cs
using Realms;
```

### 実行部分
```
var realm = Realm.GetInstance();
```

さっそくこのエラーが発生します。
<img width="820" alt="Screen Shot 2016-06-07 at 12.31.34 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/ee2a678b-844e-2695-059a-7e4f358637f9.png">

## iOSとAndroidにも対応

<img width="316" alt="Screen Shot 2016-06-07 at 12.54.25 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/11951/f6ab7752-66e4-fd12-b42a-20ca389d29eb.png">

図のようにそれぞれのPackagesで先ほどやったのと同じことをしてください。

## コード

```csharp:DogTest.cs
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`クラスを作成。

```csharp:DogTest.cs
	// 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; } 
	}
```

以下を実行しましょう。

```csharp:DogTest.cs
	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`を使用します。

*ドキュメントの注意*

https://realm.io/jp/docs/xamarin/latest/

```
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`

# あとがき

「分かりにくいぞ、もっと説明しろ」ってのがあればコメント欄へ。
質問あればコメント欄へ。
誤字・脱字があれば「編集リクエスト」で。

ここが参考になるかと思います。

http://shinriyo.hateblo.jp/entry/2016/06/04/Xamarin_%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A