Realm の構成とオープン - .NET SDK
Realmは、事前定義されたスキーマに準拠する、関連するオブジェクトのセットです。 Realm には複数のデータタイプがある限り、各タイプに対応するスキーマが存在する限り、複数のデータタイプを含めることができます。
すべての Realm は、Realm 内の各オブジェクトのバイナリ エンコーディングを含む個別の Realm ファイルにデータを保存します。 複数のデバイス間で Realm を自動的に同期し、Realm内のオブジェクトが作成、変更、または削除されるたびにを呼び出すリアクティブなイベント ハンドラーを設定できます。
Realm ファイル
Realm は、Realm 内のすべてのオブジェクトとタイプのバイナリ エンコード バージョンを単一の .realm
ファイルに保存します。 ファイルは、Realm を開くときにRealmConfigurationオブジェクトで定義したパスにあり、パスを指定しない場合はデフォルトのパスにあります。
デフォルトの Realm ファイルの名前はdefault.realm
で、OS がアプリ固有のデータを保存する場所にあります。
Tip
本番アプリケーションへの圧縮の実装
すべての本番アプリケーションでは、 ShouldCompactOnLaunchを実装して、Realm ファイルのサイズを定期的に縮小する必要があります。 Realm の圧縮の詳細については、「 Realm ファイル サイズの縮小 - .NET SDK 」を参照してください。
予備 Realm ファイル
Realm は、次のように Realm ごとに追加のファイルを作成します。
Realm ファイルの拡張子は「realm」。例:
default.realm
: オブジェクト データが含まれています。ロックファイル、"lock" の拡張子を持つファイル。例:
default.realm.lock
: Realm 内のどのバージョンのデータがアクティブに使用されているかを追跡する。 これにより、クライアント アプリケーションによってまだ使用されているストレージ領域が Realm により再利用されるのを防止します。メモ ファイルの拡張子は "note" で、例:
default.realm.note
: スレッド間通知とプロセス間通知を有効にします。管理ファイル、"management" で呼び出されるファイル。例:
default.realm.management
: 内部状態マネジメント。
これらのファイルの削除は重要な影響を与えます。 .realm
または予備ファイルの削除の詳細については、「 Realm の削除 」を参照してください。
同期なしで Realm を開く
次のセクションでは、ローカル(非同期)使用用に Realm ファイルを開く方法について説明します。 Realm との同期の使用について詳しくは、「同期された Realm の構成とオープン - .NET SDK 」を参照してください。
ローカル Realm
ローカル(同期されていない)Realm を開くには、 RealmConfigurationオブジェクトをGetInstanceAsync()
またはGetInstance()
に渡します。 次の例では、ローカル ファイル パスを持つRealmConfiguration
オブジェクトを作成し、 IsReadOnly
プロパティをtrue
に設定して、その構成情報を使用してローカル Realm を開きます。
var config = new RealmConfiguration(pathToDb + "my.realm") { IsReadOnly = true, }; Realm localRealm; try { localRealm = Realm.GetInstance(config); } catch (RealmFileAccessErrorException ex) { Console.WriteLine($@"Error creating or opening the realm file. {ex.Message}"); }
インメモリ Realm
InMemoryConfigurationオブジェクトを使用すると、メモリ内で完全にメモリ内(つまり、ディスクに書き込まれたデータなし)で実行されるRealmを作成できます。 次の例は、これを行う方法を示しています。
var config = new InMemoryConfiguration("some-identifier"); var realm = Realm.GetInstance(config);
メモリが不足している場合、インメモリ Realm は引き続きディスク領域を使用する可能性がありますが、Realm が閉じられると、インメモリ Realm によって作成されたすべてのファイルが削除されます。 インメモリRealmを作成する場合、識別子はすべてのRealm(メモリ内と永続化されたRealmの両方を含む)に対して一意である必要があります。
重要
インメモリ Realm が破棄またはガベージコレクションされると、データが失われます。 アプリの実行全体でインメモリ Realm を「アライブ」に保つには、Realm への参照を必ず保持してください。
Realm のスコープ設定
Realm インスタンスは、ネイティブ リソースが解放されるようにするためにIDisposable
を実装します。 Realm オブジェクトは、使用後すぐに、特にバックグラウンド スレッドで破棄する必要があります。 これを行う最も簡単な方法は、 using
ステートメントで Realm オブジェクトを宣言するか、Realm を操作するコードをusing (...)
ステートメントでラップします。
config = new PartitionSyncConfiguration("myPart", user); using (var realm = Realm.GetInstance(config)) { var allItems = realm.All<Item>(); }
Realm オブジェクトを単一のメソッドの外部で共有する必要がある場合は、 Dispose()メソッドを呼び出してその状態を管理するようにしてください。
realm.Dispose();
注意
一般に、Realm はバックグラウンド スレッドでのみ破棄する必要があります。Realm を破棄すると、そのインスタンスに関連付けられているすべてのオブジェクトが無効になるためです。 たとえば、メイン スレッドで Realm オブジェクトをデータにバインディングする場合は、 Dispose()
を呼び出しないでください。
クラス サブセット
デフォルトでは、すべてのRealmObject
クラスは Realm に保存されます。 場合によっては、保存されるクラスを制限する必要がある場合があります。これは、 RealmConfiguration
オブジェクトのスキーマプロパティで可能です。 次のコードは、Realm に保存する 2 つのクラスを指定する方法を示しています。
var config = new RealmConfiguration() { Schema = new Type[] { typeof(AClassWorthStoring), typeof(AnotherClassWorthStoring) } };