PR

サンプルプログラムで MongoDB Realm のデータ同期を確認する

2022年1月12日(水)
池田 卓司

サンプルプログラムとコードの説明

サンプルプログラムはコンソールアプリです。実行すると、追加や削除などの操作に割り当てられたキーの入力を求められるので、確認したい操作のキーを押下ることでRealm DBを更新できます。その更新内容は、すぐにMongoDB Atlasにも同期されます。

  • [ A ]
    パーティション名が“PUBLIC”と“User IDの値”のデータを追加する
  • [ M ]
    パーティション名が“PUBLIC”と“User IDの値”の一番最新のデータを変更する
  • [ R ]
    全てのデータを削除する
  • [ U ]
    パーティション名が“User IDの値”のデータをリストする
  • [ P ]
    パーティション名が“PUBLIC”のデータをリストする
  • [ Q ]
    アプリを終了する

最初の実行

それでは、アプリをビルドし実行してみましょう。VS Codeで[Ctrl] + [F5] キーを押下するとアプリを実行できます。最初の実行ではローカル、サーバー共に様々なリソースが作成されます。

アプリが起動したら、VS CodeのExplorerからBasicRealmOperation\Realmsフォルダ配下にRealm DBが作成されることを確認します。

“public.realm”と“user.realm”という2つのRealm DBが作成されますが、それぞれの役割は以下の通りです。

  • public.realm
    パーティション名“PUBLIC”に属するデータを格納
  • user.realm
    パーティション名“User IDの値”に属するデータを格納

続いて、ポータルサイトでRealmアプリの状態を確認します。[Realm]タブをクリックし、メニューから[Schema]をクリックすると、新しくComputerとCpuというスキーマが作成されていることが確認できます。

同様に、MongoDB AtlasにComputerとCpuという名前のコレクションが作成されていることを確認します。ポータルサイトの[Atlas]タブから[Browse Collections]をクリックします。

モデル

最初の実行で作成されたリソースはC#コードのモデルがベースとなっています。モデルとはデータの型(構造)のことで、C#では1つのクラスとして表現します。サンプルプログラムではBasicRealmOperation\Models.csに記述されています。モデルの作り方はRealmObjectクラスを継承したクラスを作成し、プロパティを追加するだけです。

サンプルプログラムにはComputerとCpuという2つのモデルクラスがあります。その関係はComputerがCpuを持つ1:1のリレーションシップとなっています。

Realmアプリと接続する場合は、以下の2つのプロパティを定義しておく必要があります。Idはデータを特定するための一意の識別子であり、Partitionはパーティション名を格納し、どのパーティションに属しているかの判断基準となります。

[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();

[MapTo("_partition")]
[Required]
public string Partition { get; set; }

より詳しい説明はファイル内にコメントとして記載しているので、そちらを参照してください。

【参照】https://gitlab.com/creationline/mongodb-realm-sampleapp/-/blob/master/BasicRealmOperation/Models.cs

データの操作と同期

それでは、コンソールアプリを操作してデータを追加してみましょう。[A]キーを押下し、データを追加します。

MongoDB Realm StudioでRealm DBを開き、データが追加されているか確認します。MongoDB Realm Studioの[Open Realm file]をクリックし、user.realmとpublic.realmをそれぞれ開きます。ComputerとCpuは1:1の関係になっているので、データのCpuのプロパティをクリックすればComputerが持つCpuの情報を参照できます。

確認が終わったら、すべてのMongoDB Realm Studioを閉じます。

続いて、MongoDB Atlasにデータが同期されているかを確認しましょう。ポータルサイトのCollectionsから、ComputerとCpuのデータ(ドキュメント)を参照します。

Realm DBに追加したデータと同じデータが表示され、同期されていることが確認できます。

ここで、プログラムの主要部分について説明します。コードはBasicRealmOperation\Program.cs に記述されています。

まずは、user-secretsの設定値を取得できるようにします。

IConfiguration config = new ConfigurationBuilder()
    .AddUserSecrets<Program>().Build();

次に、Realmアプリにログインする必要があります。ログインにはApi Keyを使用します。先ほどのconfigを使用してuser-secretsの設定値を取得しています。

App app = App.Create(config[SECRET_APPID]);
User user = await app.LogInAsync(Credentials.ApiKey(config[SECRET_APIKEY]));

続いて、Realmを操作するためのインスタンスを作成します。SyncConfigurationが重要で、これがRealmアプリと接続し、MongoDB Atlasとの同期を始めるための設定となります。以下のコードは「Realm アプリに接続し、データがパーティション“PUBLIC”に属することを宣言しながら、public.realmを開く」ことを表しています。

using Realm publicRealm = Realm.GetInstance(
    new SyncConfiguration(PUBLIC_PARTITION, user, s_realmDir + "public.realm"));

なお、Realm アプリの同期ルールとして、Realm DB のデータを更新する場合はそのデータがどのパーティションに属しているかを指定する必要があります。

以後は、通常通りのRealm DBの操作を記述するだけです。例えば、データを追加するコードは以下のようになります。AddなどのDB操作のアクションをWrite(トランザクション)で確定させます。Console.WriteLineは特に必要ありませんが、何が追加されたかをコンソール出力しています。

publicRealm.Write(() => Console.WriteLine(
    publicRealm.Add(Computer.Create(PUBLIC_PARTITION, "LaptopPC", "Share"))));

繰り返しになりますが、MongoDBを直接操作するためのコードを書く必要はありません。ローカルのRealm DBを操作するだけで、後はRealmアプリが MongoDB Atlasと同期を行ってくれます。

より詳しい説明は、ファイル内にコメントとして記載していますので、そちらを参照してください。

【参照】https://gitlab.com/creationline/mongodb-realm-sampleapp/-/blob/master/BasicRealmOperation/Program.cs

おわりに

今回は、サンプルプログラムを使って、ローカルのRealm DBとクラウドのMongoDB Atlasを同期させるプログラムについて説明しました。データ追加だけの説明になりましたが、変更と削除の操作も試していただければと思います。すべての操作において、MongoDB Atlasに同期されることを確認できます。

また、PCを2台用意してコンソールアプリをそれぞれ動かすと、片方のPCでAddした結果が、もう片方のPCにも同期され参照できます。複数台のPCを用意できる場合は、ぜひお試しください。

次回からは、実際のスマホ(Android)で動作するモバイルアプリを作成していきたいと思います。次回の第4回では、そのモバイルアプリを作成するための環境構築について説明します。

クリエーションライン富山事業所 所長
Javaや.net frameworkでのアプリ開発など、主にソフトウェアエンジニアとして業務に就く傍ら、ホスティングサービスのWindowsサーバー管理など、インフラ系の業務にも従事。現在は、チームマネジメントや北陸エリアでの事業拡張業務を担当。
Twitter: https://twitter.com/cl_toyama

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています