Realm适用iOS和Android平台,本身相比sqlite、CoreData操作简单,在这里记录下使用方式; (Swift4.2)
安装
pod 'RealmSwift'
基础使用
打开 Realm 数据库
要打开一个 Realm 数据库,首先需要初始化一个新的 Realm 对象:
let realm = try! Realm()
try! realm.write {
realm.add(myDog)
}
复制代码
这将会初始化出一个默认 Realm 数据库。
配置 Realm 数据库
- 可配置本地 Realm 数据库在磁盘上的路径;
- 对于可同步 Realm 数据库而言,可以配置管理用户,以及服务器上的远程路径;
- 配置版本迁移
- 压缩功能,高效地利用磁盘空间。
func setDefaultRealmForUser(username: String) {
var config = Realm.Configuration()
// 使用默认的目录,但是请将文件名替换为用户名
config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm")
// 将该配置设置为默认 Realm 配置
Realm.Configuration.defaultConfiguration = config
}
复制代码
操作 Realm 对象
对象的自更新
Object 实例是底层数据的动态体现,会自动进行更新;因此这意味着无需去刷新对象的当前状态。修改某个对象的属性,会立即影响到所有指向该对象的其他实例。
let myDog = Dog()
myDog.name = "Fido"
myDog.age = 1
try! realm.write {
realm.add(myDog)
}
let myPuppy = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
myPuppy!.age = 2
}
print("age of my dog: \(myDog.age)") // => 2
复制代码
这不仅使得 Realm 保证高速和高效,同时还让代码更为简洁、更为灵活。如果您的 UI 代码基于某个特定的 Realm 对象来实现,那么在触发 UI 重绘以前,您根本无需进行数据刷新或者重新检索。
对象存储
对象的所有更改(添加、修改和删除)都必须在写入事务内完成。
Realm 对象可以被实例化,还可作为未管理对象使用(例如,还未添加到 Realm 数据库),并且使用方式与其它正常 Swift 对象无异。然而,如果要在线程之间共享对象,或者在应用启动后反复使用,那么您必须将这些对象添加到 Realm 数据库中。向 Realm 数据库中添加对象必须在写入事务内完成。由于写入事务将会产生无法忽略的性能消耗,因此您应当检视您的代码,以确保尽可能减少写入事务的数量。
warning:Realm 的写入操作是同步以及阻塞进行的,它并不会异步执行。如果线程 A 开始进行写入操作,然后线程 B 在线程 A 结束之前,对相同的 Realm 数据库也执行了写入操作,那么线程 A 必须要在线程 B 的写入操作发生之前,结束并提交其事务。写入事务会在 beginWrite() 执行时自动刷新,因此重复写入并不会产生竞争条件。
更新对象
Realm 提供了一系列更新对象的方法,根据使用场景的不同, 每个方法都有各自的优缺点。
直接更新
您可以在写入事务中,通过设置对象的属性从而完成更新。
// 在事务中更新对象
try! realm.write {
author.name = "Thomas Pynchon"
}复制代码
键值编码
Object、Result 和 List 均允许使用 键值编码(KVC)。 当您需要在运行时决定何种属性需要进行更新的时候, 这个方法就非常有用了。 批量更新对象时,为集合实现 KVC 是一个很好的做法, 这样就不用承受遍历集合时为每个项目创建访问器 所带来的性能损耗。
let persons = realm.objects(Person.self)
try! realm.write {
persons.first?.setValue(true, forKeyPath: "isFirst")
// 将每个 person 对象的 planet 属性设置为 "Earth"
persons.setValue("Earth", forKeyPath: "planet")
}复制代码
通过主键更新
如果数据模型类中包含了主键,那么 可以使用 Realm().
add(_:update:)
,从而让 Realm 基于主键来自动更新或者添加对象。
// 创建一个 book 对象,其主键与之前存储的 book 对象相同
let cheeseBook = Book()
cheeseBook.title = "Cheese recipes"
cheeseBook.price = 9000
cheeseBook.id = 1
// 更新这个 id = 1 的 book
try! realm.write {
realm.add(cheeseBook, update: true)
}复制代码
如果这个主键值为 “1” 的 Book 对象已经存在于数据库当中 ,那么该对象只会进行更新。如果不存在