配置并打开 Realm - .NET SDK
域是一设立符合预定义模式的相关对象。 Realm 可以包含多种类型的数据,只要每种类型都存在模式。
每个域将数据存储在单独的域文件中,该文件包含域中每个对象的二进制编码。 您可以跨多个域自动同步 Realm,并设立响应式事件处理程序,以便在每次创建、修改或删除域中的对象时调用函数。
Realm 文件
Realm将域中每个对象和类型的二进制编码版本存储在单个 .realm
文件中。 该文件位于您打开域时在RealmConfiguration对象中定义的路径,或者如果您未指定路径,则位于默认路径。
默认 Realm 文件名为default.realm
,位于操作系统存储特定于应用的数据的位置。
辅助 Realm 文件
Realm 会为每个 Realm 创建附加文件:
realm 文件,后缀为 "realm",例如
default.realm
:包含对象数据。锁定文件,后缀为 "lock",例如
default.realm.lock
:跟踪 Realm 中哪些数据版本正在使用中。 这可以防止 Realm 回收客户端应用程序仍在使用的存储空间。note 文件,后缀为 "note",例如
default.realm.note
:启用线程间和进程间通知。管理文件,后缀为“管理”,例如
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}"); }
内存 Realms
使用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 对象,或在using (...)
语句中包装与 Realm 交互的代码:
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
对象的Schema属性来实现。 以下代码演示了如何指定要存储在 Realm 中的两个类:
var config = new RealmConfiguration() { Schema = new Type[] { typeof(AClassWorthStoring), typeof(AnotherClassWorthStoring) } };