Realm 笔记 (一)

img

系列文章目录:

  1. Realm 笔记 (一)
  2. Realm 笔记 (二)

Realm Database 基于 C++ 编写的核心引擎,支持多平台多语言的移动端数据库。因其面向对象存取模型,高效的性能,开源的特性,不失为移动端数据库好的选择。之前项目也有使用过,基本上看官方文档和 Demo,即可解决大部分问题。最近买了 Advanced Swift Spring Bundle,包含 Realm: Building Modern Swift Apps with Realm Database, 故再系统学习一遍,是为此笔记。

img


第一章:介绍Realm

  1. Realm API 是更现代且符合最佳实践的代码,比处理 C 语言的 API 和 SQLite 容易的多。亦即无需使用 SQL 语言,而是苹果的 NSPredicate。
  2. Realm 数据库的设计哲学的基础之一是现代的应用开发使用的对象。模型就是对象,Realm 提供基类 Object,继承自 NSObject。属性也支持 Swift 中原始和基本类型,对集合类也进行了封装,纯面向对象编程。

对象:是指面向对象编程中的对象,Object:文中专指 Realm 中模型的基类 Object

img

img

3. 如果你偏爱 struct,只需要添加 toStruct()fromStruct(_) 方法到 object,即可快速读取 struct 的数据。

img


第三章:Object基础和数据类型

数据类型:

  1. 对象类型属性:@objc dynamic var 修饰,String、Date、Data,支持可选
  2. 原始类型属性:包含 Bool、Int、Float、Double。let allowsPublication = RealmOptional<Bool>() 需要使用 Realm 封装的可选类型
  3. 自定义类型:比如封装 CLLocation、封装枚举值

img

属性速查表

img

Object 支持还以下几个属性:

  1. 计算属性
  2. 主键:在移动应用使用自增主键不是一个好主意,尤其是使用 Realm。
  3. 索引:谨慎的使用索引,仅在反复查询的属性上使用。
  4. 忽略属性

@objcMembers 修饰 Object,是非常适合使用的一个场景。


第四章:模式和关系

  1. 对一
  2. 对多(Object):使用 List,和 Swift 中 Array 类似
  3. 对多(Value):
  4. 反向关系:LinkingObjects

第五章:读写

查询结果(Results)

Results 是一个惰性抓取持久化数据的 API。

过滤结果:使用 NSPredicate

  1. 子查询谓词(Sub-query predicates)

img

  1. 谓词速查表

img

img

排序结果:单属性排序 .sorted(byKeyPath: “firstName”) 和多个属性排序

img

写入数据时:因为存储 Object 包括修改属性,都会修改硬盘文件,必须进行写入事务。


第六章:通知和响应式应用

更改的通知

Realm 的核心特征之一就是数据永不过时的理念。

通知三个级别:

  1. Object
  2. Collection:list、results、linking objects
  3. Realm

通知的细节:

  1. 线程:通知回调在和订阅通知相同线程被调用。
  2. Run loop:Realm 使用 run loop 发送更改通知。因此你只能在有 run loop 的线程订阅通知。
  3. 通知的间隔尺度(granularity):Realm 在每次成功写入事务后推送通知给观察者。因为推送使用的是订阅线程的 run loop(可能有时候忙于其它事情),可能会在 Realm 发生了其它更改才送达。这种情况下,Realm 会聚集所有更改一起推送通知。
  4. 仅限持久化的 Object
  5. 通知令牌(Notification tokens):手动 invalidate()或者在内存中释放(View Controller 被释放)

响应式应用

响应式系统拥有以下几个关键特性:对发生的变化做出反应,使用基于消息的工作流程,具有扩展能力等等。Realm 都提供了完整的支持。