Realm 笔记 (一)
系列文章目录:
Realm Database 基于C++编写的核心引擎,支持多平台多语言的移动端数据库。因其面向对象存取模型,高效的性能,开源的特性,不失为移动端数据库好的选择。之前项目也有使用过,基本上看官方文档和Demo,即可解决大部分问题。最近买了 Advanced Swift Spring Bundle,包含 Realm: Building Modern Swift Apps with Realm Database, 故再系统学习一遍,是为此笔记。
第一章:介绍Realm
- Realm API是更现代且符合最佳实践的代码,比处理C语言的API和SQLite容易的多。亦即无需使用SQL语言,而是苹果的NSPredicate。
- Realm 数据库的设计哲学的基础之一是现代的应用开发使用的对象。模型就是对象,Realm提供基类Object,继承自NSObject。属性也支持Swift中原始和基本类型,对集合类也进行了封装,纯面向对象编程。
对象:是指面向对象编程中的对象,Object:文中专指Realm中模型的基类Object
3.如果你偏爱 struct,只需要添加 toStruct()
和 fromStruct(_)
方法到 object,即可快速读取struct的数据。
第三章:Object基础和数据类型
数据类型:
- 对象类型属性:
@objc dynamic var
修饰,String、Date、Data,支持可选 - 原始类型属性:包含Bool、Int、Float、Double。
let allowsPublication = RealmOptional<Bool>()
需要使用Realm封装的可选类型 - 自定义类型:比如封装CLLocation、封装枚举值
属性速查表
Object支持还以下几个属性:
- 计算属性
- 主键:在移动应用使用自增主键不是一个好主意,尤其是使用Realm。
- 索引:谨慎的使用索引,仅在反复查询的属性上使用。
- 忽略属性
@objcMembers 修饰 Object,是非常适合使用的一个场景。
第四章:模式和关系
- 对一
- 对多(Object):使用List,和Swift中Array类似
- 对多(Value):
- 反向关系:
LinkingObjects
第五章:读写
查询结果(Results)
Results 是一个惰性抓取持久化数据的API。
过滤结果:使用NSPredicate
- 子查询谓词(Sub-query predicates)
- 谓词速查表
排序结果:单属性排序 .sorted(byKeyPath: “firstName”) 和多个属性排序
写入数据时:因为存储Object包括修改属性,都会修改硬盘文件,必须进行写入事务。
第六章:通知和响应式应用
更改的通知
Realm 的核心特征之一就是数据永不过时的理念。
通知三个级别:
- Object
- Collection:list、results、linking objects
- Realm
通知的细节:
- 线程:通知回调在和订阅通知相同线程被调用。
- Run loop:Realm使用 run loop 发送更改通知。因此你只能在有 run loop的线程订阅通知。
- 通知的间隔尺度(granularity):Realm在每次成功写入事务后推送通知给观察者。因为推送使用的是订阅线程的run loop(可能有时候忙于其它事情),可能会在Realm发生了其它更改才送达。这种情况下,Realm会聚集所有更改一起推送通知。
- 仅限持久化的 Object
- 通知令牌(Notification tokens):手动invalidate()或者在内存中释放(View Controller 被释放)
响应式应用
响应式系统拥有以下几个关键特性:对发生的变化做出反应,使用基于消息的工作流程,具有扩展能力等等。Realm 都提供了完整的支持。