<iOS 实践经验>Realm ORM 数据库的使用
Realm 将数据对象视为 Live Object, 意味着它会自动对这些对象进行更新.
参考链接: 开始使用 Realm 数据库
Realm 是一种 ORM 类型的, 线程安全的, 响应式的, 高性能的数据库. 它可以将开发者从复杂的查询语句或是 Core Data 的魔爪里面解放出来.
1 如何安装
可以直接使用二进制包, 或是 CocoaPods 或 Carthage 来引入 Realm, 详见官方文档.
2 实践
下面就来看看如何在实际工程中使用 Realm.
2.1 创建 Live Object
首先需要 import RealmSwift
, 然后让类继承 Object 类型即可:
import Foundation
import RealmSwift
// 需要注意, Object 类型是 @objc 修饰的, 意味着 struct 无法继承它.
public class Reminder: Object {
@objc dynamic var name = ""
@objc dynamic var done = false
//...
}
我们的模型对象就建立好了. 下面的内容中都只会使用到这个模型对象.
(注意, 为了便于演示, 下面所有的代码中均使用 try!
, 但实际工程中应尽量使用 do-catch
来进行异常捕捉和处理.)
2.2 创建 Reminder 管理类型
这个 ReminderManager 负责管理 Reminder 对象, 并基于 Realm 向外提供功能.
public class ReminderManager {
var realm: Realm!
var reminderList: Results<Reminder> {
return realm.objects(Reminder.self)
}
init() {
realm = try! Realm()
}
}
下面来实现它里面的增删改查方法:
// 增
public func addReminder(name: String, done: Bool, note: String) {
let reminderItem = Reminder()
reminderItem.name = name
reminderItem.done = done
reminderItem.note = note
try! realm.write {
self.realm.add(reminderItem)
}
}
// 删
public func deleteReminder(name: String) {
let reminder = queryReminderWith(name: name)
guard let reminderToDelete = reminder else { return }
try! realm.write {
self.realm.delete(reminderToDelete)
}
}
// 改
public func alterReminder(name: String, done: Bool, note: String) {
let reminder = queryReminderWith(name: name)
guard let reminderToModity = reminder else { return }
try! realm.write {
reminderToModity.done = done
reminderToModity.note = note
}
}
// 查
public func queryReminderWith(name: String) -> Reminder? {
let index = reminderList.index(where: { reminder in
reminder.name == name
})
guard let reminderIndex = index else { return nil }
let reminder = reminderList[reminderIndex]
return reminder
}
下面就可以对其进行测试了.
另外如果需要在初始化 realm 的时候指定它为 In-Memory 的, 可以将
realm = try! Realm()
修改为如下:
let config = Realm.Configuration(inMemoryIdentifier: "In-Mem")
realm = try! Realm(configuration: config)
因为默认的初始化是将数据保存在磁盘上的. 这里为了测试, 可在初始化的时候指定为内存数据库, 方便学习.
3 Live Object
Live Object这里需要明确 Live Object 的特性.
当一个 Object 还没有被加入到 Realm 之前, 就是一个普通的 Object. 但是加入到 Realm 后, 再次被查询出来的时候, 它就是一个 Live Object 了. 意味着当在 Realm 中修改该 Object 对应的数据的时候, 在内存中的这个 Object 的值也会被同时更新.
4 一些基本理念
写, 删, 改操作都需要在 write 事物中进行.
查询: 这里查询有多种方式, 需要进行掌握.
同一个 Realm 数据库实例无法跨线程访问, 意味着只能在创建的线程中访问它?
Live objct 的属性无法再在 write 事务之外进行更改了.