<iOS 实践经验>Realm ORM 数据库的使用

2017-11-11  本文已影响15人  貘鸣

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 事务之外进行更改了.

上一篇下一篇

猜你喜欢

热点阅读