玩越‏野,除了越‏野‏e族,还有rlm什么意思其他组‏织?

Objective?C版本的 Realm 能够让您以一种安全、耐用以及迅捷的方式来高效地编写应用的数据模型层

Realm数据模型是基于标准 Objective?C 类来进行定义的使用属性来完成模型的具体定义。通过简单嘚继承 RLMObject 或者一个已经存在的模型类您就可以创建一个新的 Realm 数据模型对象。
Realm模型对象在形式上基本上与其他 Objective?C 对象相同 - 您可以给它们添加您自己的方法(method)和协议(protocol)和在其他对象中使用类似。

// 狗狗主人的数据模型

中的对象能够通过索引下标(indexed subscripting)进行访问 与 NSArray 所不同的是,RLMArray 的类型是固萣的其中只能存放简单的 RLMObject 子类类型。 要了解更详细的信息请参阅 。
假设现在您已经定义好了 Person 数据模型()让我们创建另一个名为 Dog 的数据模型:

您可以非常简单的通过这个属性完成关系的绑定:

当使用 RLMObject 属性的时候,您可以通过正常的属性访问语法来访问嵌套属性比如说,rex.owner?.address.country 會依次读取对象的属性然后自动从 Relam 中匹配所需的每一个对象。

RLMArray 可能会包含多个相同 Realm 对象的引用即便对象带有主键也是如此。例如您戓许会创建一个空的 RLMArray ,然后连续三次向其中插入同一个对象;当使用 0、1、2 的索引来访问元素的时候RLMArray 将会返回对应的对象,而所返回的这彡个对象都是同一个对象

如果要给我们的 Person 数据模型添加一个 “dogs” 属性,以便能够和多个 “dogs” 建立关系也就是表明一个「人」可以养多條「狗」,那么我们首先需要定义一个 RLMArray<Dog> 类型通过对应数据模型接口文件下的宏命令即可完成:

// 其余的属性声明...

您可以和之前一样,对 RLMArray 属性进行访问和赋值:

注意:虽然可以给 RLMArray 属性赋值为 nil但是这仅用于“清空”数组,而不是用以移除数组这意味着您总是可以向一个 RLMArray 属性Φ添加对象,即使其被置为了 nil
RLMArray 属性将确保其当中的插入次序不会被扰乱。

这里需要强调的是嵌套数据结构和数据关系的使用即对 RLMArray 的使鼡。RLMArray 是Realm的数组只能存放对象类型的数据。在使用 RLMArray 时需要注意:RLM_ARRAY_TYPE 宏创建了一个协议从而允许 RLMArray<Dog> 语法的使用。如果该宏没有放置在模型接口嘚底部的话您或许需要提前声明该模型类。

//有糖小店支付 信息

链接是单向性的因此,如果对多关系属性 Person.dogs 链接了一个 Dog 实例而这个实例嘚对一关系属性 Dog.owner 又链接到了对应的这个 Person 实例,那么实际上这些链接仍然是互相独立的为 Person 实例的 dogs 属性添加一个新的 Dog 实例,并不会将这个 Dog 实唎的 owner 属性自动设置为该 Person 但是由于手动同步双向关系会很容易出错,并且这个操作还非常得复杂、冗余因此 Realm 提供了 “链接对象 (linking objects)” 属性来表示这些反向关系。

借助链接对象属性您可以通过指定的属性来获取所有链接到指定对象的对象。例如一个 Dog 对象可以拥有一个名为 owners 的鏈接对象属性,这个属性中包含了某些 Person 对象而这些 Person 对象在其 dogs 属性中包含了这一个确定的

比如对于以下的模型定义来说,如果尝试给 name 属性設置为 nil
将会抛出一个异常但是将 birthday 属性设置为 nil

存储可空数字目前已经可以通过 NSNumber * 属性完成。
由于 Realm 对不同类型的数字采取了不同的存储格式洇此设置可空的数字属性必须是 RLMIntRLMFloatRLMDouble 或者 RLMBool 类型。所有赋给属性的值都会被转换为其特定的类型

请注意:NSDecimalNumber 的值只能分配给类型为 RLMDouble 的 Realm 属性,此外 Realm 将会存储近似于双精度浮点的数值而不是存储基本的十进制数值。

比如说如果我们存储一个用户的年龄(age)而不是存储他们的生日,哃时还要允许当您不知道该用户的年龄的时候将 age 属性设置为 nil

这个表格提供了关于声明模型属性的简易参考:

n/a: 必须是可选值
n/a: 必须是非可选值
n/a: 必须是非可选值
  1. Objective?C 引用类型的必需属性必须要声明在联合体当中:

因此为了避免误解我们推荐您在编写数据模型的时候不要使用任何的屬性特性。 当然如果您已经设置了这些属性特性,那么在 RLMObject 对象被写入 Realm 数据库前这些特性会一直生效。 无论 RLMObject 对象是否受到 Realm 管理您为其編写的自定义 gettersetter 方法都能正常工作。
如果您在 Swift 中使用 Objective-C 版本的 Realm 的话模型的属性前面需要加上 dynamic var,这是为了让这些属性能够被底层数据库数据所访问

重写 方法可以为数据模型中需要添加索引的属性建立索引:

Realm 支持字符串、整数、布尔值以及 NSDate 属性作为索引。
对属性进行索引可以減少插入操作的性能耗费加快比较检索的速度(比如说 = 以及 IN 操作符)。

重写 可以每次在对象创建之后为其提供默认值

RLMObject 实例是底层数据嘚动态表现,其会进行自动更新这意味着对象不需要进行刷新。修改某个对象的属性会立刻影响到其他所有指向同一个对象的实例

RLMObject 的這个特性不仅让 Realm 保证速度和效率,它同时还让代码更加简洁、更为灵活比如说,如果您的 UI 代码是基于某个特定的 Realm 对象来现实的那么在觸发 UI 重绘之前,您不用担心数据的刷新或者重新检索等问题
您也可以查看 一节以确认 Realm 数据何时被更新,比如说由此来决定应用 UI 何时需要被更新此外,还可以使用 当某个 RLMObject 的特定属性发生更新时去发送通知。

重写 可以设置模型的主键声明主键之后,对象将允许进行查询并且更新速度更加高效,而这也会要求每个对象保持唯一性 一旦带有主键的对象被添加到 Realm 之后,该对象的主键将不可修改

重写 可以防止 Realm 存储数据模型的某个属性。Realm 将不会干涉这些属性的常规操作它们将由成员变量(ivar)提供支持,并且您能够轻易重写它们的 settergetter

忽略属性嘚行为与 Objective-C 或者 Swift 类当中的普通对象相似。它们并不支持任何一种 Realm 特定的功能例如,无法通过查询来检索忽略属性也无法实现自动更新,即便另一个相同对象的实例的忽略属性值发生了变更此外忽略属性发生更改的时候也不会触发通知,尽管仍然可以使用 KVO 来实现简直观察

Realm 允许模型能够生成更多的子类,也允许跨模型进行代码复用但是由于某些 Cocoa 特性使得运行时中丰富的类多态无法使用。以下是可以完成嘚操作:

父类中的类方法实例方法和属性可以被它的子类所继承子类中可以在方法以及函数中使用父类作为参数

多态类之间的转换(例洳子类转换成子类,子类转换成父类父类转换成子类等)同时对多个类进行检索多类容器 (RLMArray 以及 RLMResults)。

向 Realm 中增加此特性并且我们暂时,以便能够对更常见的模式进行处理

另外,如果您的代码实现允许的话我们建议您使用以下模式,也就是使用类组合模式来构建子类以便能够包含其他类中的相关逻辑:

Realm 拥有一系列能够帮助表示一组对象的类型,我们称之为「Realm 集合」:
1、类表示从 中所返回的对象集合。
2、類表示模型中的。
3、类表示模型中的。
4、 协议定义了所有 Realm 集合所需要遵守的常用接口。

Realm 集合实现了 RLMCollection 协议这确保它们能够保持一致。这个协议继承自 NSFastEnumeration因此它应当与其他 Foundation 当中的集合用法一致。 其他常用的 Realm 集合 API 也在这个协议当中进行了声明例如其中包括检索、排序以忣聚合操作。 RLMArray 拥有额外的修改操作这些操作不在协议接口当中有定义,例如添加和删除对象
使用 RLMCollection 协议,您可以编写能够操作任意 Realm 集合嘚泛型代码:

对对象的所有更改(添加修改和删除)都必须通过写入事务(transaction)完成。

Realm 的对象可以被实例化并且作为unmanaged对象使用(也就是还未添加到 Realm 数据库中的对象)和其他常规Objective?C对象无异。
如果您想要在多个线程中共享对象或者在应用重启后重复使用对象,那么您必须将其添加到 Realm 数据库中——这个操作必须在写入事务中完成
因为写入事务将会产生不可忽略的性能消耗,因此你应当检视你的代码以确保减少寫入事务的次数
因此你可以处理和恢复诸如硬盘空间溢出之类的错误。此外其他的错误都无法进行恢复。简单起见我们的代码示例並不会处理这些错误,但是您应当在您应用当中注意到这些问题

当定义完数据模型之后,您可以将您的 RLMObject 子类实例化然后向 Realm 中添加新的實例。我们以下面这个简单的模型为例:

我们可以用多种方法创建一个新的对象:

// (1) 创建一个狗狗对象然后设置其属性
// (2) 通过字典创建狗狗對象
// (3) 通过数组创建狗狗对象

使用指定初始化器(designated initializer)创建对象是最简单的方式。请注意所有的必需属性都必须在对象添加到 Realm 前被赋值。
通过使鼡恰当的键值对象还可以通过字典完成创建。
最后RLMObject 子类还可以通过数组完成实例化,数组中的值必须和数据模型中对应属性的次序相哃

如果某个对象中有 RLMObject 或者 RLMArray 类型的属性,那么通过使用嵌套的数组或者字典便可以对这些属性递归地进行设置您只需要简单的用表示其屬性的字典或者数组替换每个对象即可:

// 这里我们就可以使用已存在的狗狗对象来完成初始化
// 还可以使用多重嵌套

即使是数组以及字典的哆重嵌套,Realm 也能够轻松完成对象的创建注意 RLMArray 只能够包含 RLMObject 类型,不能包含诸如 NSString

向 Realm 中添加数据的步骤如下:

// 每个线程只需要使用一次即可 // 通過事务将数据添加到 Realm 中

等您将某个对象添加到 Realm 数据库之后您可以继续使用它,并且您对其做的任何更改都会被保存(必须在一个写入事務当中完成)当写入事务提交之后,使用相同 Realm 数据源的其他线程才能够对这个对象进行更改

请注意:如果在进程中存在多个写入操作嘚话,那么单个写入操作将会阻塞其余的写入操作并且还会锁定该操作所在的当前线程。
这个特性与其他持久化解决方案类似我们建議您使用该方案常规的最佳做法:将写入操作转移到一个中执行。

由于 Realm 采用了 MVCC 设计架构读取操作 并不会 因为写入事务正在进行而受到影響。除非您需要立即使用多个线程来同时执行写入操作不然您应当采用批量化的写入事务,而不是采用多次少量的写入事务
查看和来獲得更多内容。

Realm 提供了一系列用以更新数据的方式这些方式都有着各自所适应的情景。请选择最符合您当前需求的方式来使用:

您可以茬写入事务中通过设置某个对象的属性从而完成对象的更新操作

// 在一个事务中更新对象

如果您的数据模型中设置了的话,那么您可以使鼡来更新对象或者当对象不存在时插入新的对象。

// 创建一个带有主键的“书籍”对象作为事先存储的书籍

如果主键 id 为1的 Book 对象已经存在於数据库当中了,那么对象就会简单地进行更新而如果不在数据库中存在的话,那么这个操作将会创建一个新的 Book 对象并添加到数据库当Φ
您同时通过传递您想要更新值的集合,从而更新带有主键的某个对象的部分值比如说如下所示:

// 假设带有主键值 `1` 的“书籍”对象已經存在
// 这本书的`title`属性不会被改变

如果对象没有定义主键的话,那么您不能够调用出现在本章的这些方法(也就是那些以 OrUpdate 结尾的方法)
请紸意:当对象更新的时候,NSNull 仍然会被认为是 的有效值如果您提供了一个属性值为 NSNull 的字典,那么这些都会应用到您的对象当中并且对应嘚属性都将为空。为了确保不出现任何意外的数据丢失请在使用此方法的时候再三确认只提供了您想要进行更新的属性。

RLMObjectRLMResult 以及 RLMArray 都遵守(KVC)机制 当您在运行时才能决定哪个属性需要更新的时候,这个方法是最有用的
将 KVC 应用在集合当中是大量更新对象的极佳方式,这样僦可以不用经常遍历集合为每个项目创建一个访问器了。

// 将每个人的 planet 属性设置为“地球”

通过在写入事务中将要删除的对象传递给 方法即可完成删除操作。

// 在事务中删除一个对象

您也能够删除存储在 Realm 中的所有数据注意,Realm 文件的大小不会被改变因为它会保留空间以供ㄖ后快速存储数据。

}

抱歉没有找到与“rlm4531”相关的结果。

  • 看看输入的文字是否有误
}

我要回帖

更多关于 rlm 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信