[Xamarin] 軽量データベースRealmを使用する(2) ~データの読み書き~

前回に引き続き、今回はRealmによるデータの読み書きをみていきます。

使用したRealmのバージョンは2.1.0です。

モデルの準備

今回は、以下のモデルを準備して、データの読み書きを行うこととします。

public class Person : RealmObject
{
    public string Name { get; set; }
    public string Manager { get; set; }
}

Realmインスタンスの取得

Realmによるデータの読み書きをするには、以下のようにしてインスタンスを取得しておく必要があります。

var realm = Realm.GetInstance();

データの書き込み

インスタンスを取得したら、以下のようにしてWriteメソッドを使用してデータを追加します。

この例では2件のデータを追加しています。

var realm = Realm.GetInstance();

realm.Write(() =>
{
    realm.Add(new Person{ Name = "HIRO", Manager = "Bill" });
    realm.Add(new Person{ Name = "Jim", Manager = "Steve" });
});

データの読み取り

全データを取得したい場合は以下のようにします。

var p = realm.All<Person>();

条件を指定してデータを取得したい場合は、以下のようにWhereを使用します。

この場合はNameが「HIRO」のデータを取得します。

var p = realm.All<Person>().Where(d => d.Name == "HIRO");

データの件数を取得する

データ件数を取得したい場合はCount()メソッドを使用します。

全データ件数を取得したい場合は以下のようにします。

var count = realm.All<Person>().Count();

指定したデータの件数を取得したい場合は以下のようにします。

var count = realm.All<Person>().Where(d => d.Name == "HIRO").Count();

データの更新

データを更新するには、取得したデータのプロパティを書き換えます。データの書き込み同様にWriteメソッドを使用します。

例えばNameが「HIRO」のManagerを「Someone」に書き換えたい場合は、以下のようにします。

データを取得する際に.First()としているのは、先頭の1件に対して書き換えたいためです。

var p = realm.All<Person>().Where(d => d.Name == "HIRO").First();

realm.Write(() =>
{
    p.Manager = "Someone";
});

データの削除

データを削除するには、RealmインスタンスのRemoveメソッドを使用します。

以下はNameが「HIRO」のデータを削除します。

var realm = Realm.GetInstance();

var p = realm.All<Person>().Where(d => d.Name == "HIRO").First();

realm.Write(() =>
{
    realm.Remove(p);
});

データベースを削除する

モデルの内容が変更になったりして、最初からデータベースを作り直したい場合があります。このような場合は、以下のようにDeleteRealmメソッドを使用します。

var config = new RealmConfiguration();
Realm.DeleteRealm(config);

 

[Xamarin] 軽量データベースRealmを使用する(1) ~モデル作成編~

XamarinのCrossPlatfom開発でデータ管理をする方法はいくつかあるのですが、今回から軽量データベースRealm(レルム)を使用する方法をみていきます。

※スクショはVisual Studio for Macで掲載しますが、Windows版のVisual Studioでもほぼ同様ですので省略します。

新規プロジェクトの作成

まずは、新規で空白のフォームアプリを作成します。プロジェクト名は「RealmSample」としました。

Realmパッケージの導入

続いてRealmパッケージを導入します。

はじめにソリューションエクスプローラーでPCLプロジェクト「RealmSample」を右クリックし、「NuGetパッケージの追加」を選択します。

「パッケージを追加」ダイアログが表示されるので、右上の検索窓にRealmと入力して、検索で見つかった一覧で「Realm」にチェックを付けて[パッケージを追加]ボタンをクリックします。

同様にしてiOSのプロジェクトとAndroidのプロジェクトにもRealmnのパッケージを追加します。

モデルの作成

タイトルをモデルの作成としましたが、いわゆる1レコード分のデータ用クラスを作成します。

PCLプロジェクトを右クリックして新規のクラスを作成します。

ここでは会社の部署を管理するモデルを作成することとし、クラス名を「Department」とします。

モデルを作成するには、RealmObjectを継承したクラスにする必要があります。

usingにはRealmsを追加してください。

このモデルには、部署をユニークにするためのDeptId、部署名を管理するName、マネージャーを管理するためのManagerプロパティを持たせています。

プライマリーキーを作成する場合は属性[PrimaryKey]を付けてください。Realmではプライマリーキーのオートインクリメントはまだサポートされていないので、Guid.NewGuid()を使用して、自動生成されるGUIDを割り当てるようにしています。もちろん任意の値を割り当てても構いません。

using Realms;
using System;

namespace RealmSample
{
    public class Department : RealmObject
    {
        [PrimaryKey]
        public string DeptId { get; set; } = Guid.NewGuid().ToString();

        public string Name { get; set; }
        public string Manager { get; set; }
    }
}

 

Realmがサポートしているデータ型について

現在Realmがサポートしているデータ型は以下のものがあります。

  • bool
  • char
  • byte
  • int
  • long
  • float
  • double
  • string
  • DateTimeOffset(※DateTimeではないので注意)
  • IList<T>

次回は、データベース操作について取り上げます。

 

 

 

 

 

 

 

[Xamarin.CrossPlatform] マスタ/詳細アプリのプロジェクトを理解する4

前回の「[Xamarin.CrossPlatform] マスタ/詳細アプリのプロジェクトを理解する3」では、最初に実行されるMainPage.csとリスト表示をするファイルItemsPage.xaml、ItemPages.xaml.csについて見てきました。
今回は、リストに表示するデータ作成部分について見ていきます。

おさらい

マスタ/詳細プロジェクトは実行すると以下のような画面になり、データがリスト表示されます。

見てわかる通り、1つの項目はアイテムのタイトルと詳細から成り立っています。

Items.cs

リストに表示される1つのデータはItemsクラスに格納します。このクラスはModelsフォルダ内にあります。Itemsクラスのコードは以下のようになっており、リストに表示するタイトル部分のTextプロパティと、詳細部分のDescriptionプロパティを持っていることがわかります。IDは主キーとして使用します。

using System;

namespace MasterDetailSample
{
    public class Item
    {
        public string Id { get; set; }
        public string Text { get; set; }
        public string Description { get; set; }
    }
}

ItemsViewModel.cs

ItemsViewModelクラスは、ItemsPageとItemデータの橋渡しとなるクラスです。このクラスはBaseViewModelクラスを継承して作られています。

 

using System;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace MasterDetailSample
{
    public class ItemsViewModel : BaseViewModel
    {
        public ObservableCollection<Item> Items { get; set; }
        public Command LoadItemsCommand { get; set; }

        public ItemsViewModel()
        {
            Title = "Browse";
            Items = new ObservableCollection<Item>();
            LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());

            MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
            {
                var _item = item as Item;
                Items.Add(_item);
                await DataStore.AddItemAsync(_item);
            });
        }

        async Task ExecuteLoadItemsCommand()
        {
            if (IsBusy)
                return;

            IsBusy = true;

            try
            {
                Items.Clear();
                var items = await DataStore.GetItemsAsync(true);
                foreach (var item in items)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }
    }
}

ItemsViewModelは、リストに表示するデータ(Itemsクラス)を管理します。

12行目をみるとわかる通り、このデータはObservableCollectionで管理をします。ObservableCollectionはアイテムに対して、追加、更新、削除などの変更があった場合に、コレクションの変更通知(CollectionChanged)を出すことができるようになっています。

次に21〜26行目を見てみましょう。MessagingCenter.SubscribeはXamarin.Forms側からメッセージを受け取った際に処理を行うものです。ここではアイテムの追加処理をしています。ここではAddItemというメッセージが送られてきた時に処理が行われるようにしています。

では、どこでAddItemのメッセージを送信しているのかというと、新規アイテム追加ページ()NewItemPage.xaml.cs)のSaveを押した時です。その部分のコードは以下のようになっています。

async void Save_Clicked(object sender, EventArgs e)
{
    MessagingCenter.Send(this, "AddItem", Item);
    await Navigation.PopToRootAsync();
}

次に29行目からExecuteLoadItemsCommand()ですが、このメソッドはページが表示されたときに実行されます。保存されているデータを取り出してリストに表示をします。