Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

まえがき

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

Screen Shot 2016-06-07 at 12.41.55 AM.png

本物の歯車

この歯車です。「Add Packages...」を選択。
Screen Shot 2016-06-09 at 8.39.10 AM.png

早速テストのプログラム

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

最初のコード

インポート

DogTest.cs
using Realms;

実行部分

var realm = Realm.GetInstance();

さっそくこのエラーが発生します。
Screen Shot 2016-06-07 at 12.31.34 AM.png

iOSとAndroidにも対応

Screen Shot 2016-06-07 at 12.54.25 AM.png

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

コード

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クラスを作成。

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; } 
    }

以下を実行しましょう。

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.LogWriteusing 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

shinriyo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした