RSRealmHelper 1.1.3

RSRealmHelper 1.1.3

Andre Della TorreMarcus Costa 维护。



 
依赖
RealmSwift>= 0
KeychainAccess>= 0
 

  • 作者:
  • Marcus Costa

RSRealmHelper

CI Status Platform CocoaPods Compatible Swift 4.0.x License

描述

RSRealmHelper 库是一个用于与 Realm 数据库工作的类辅助器,用于设置数据库时消除所有样板代码。此库配置所有 Realm 数据库以与加密一起工作,使用 KeyChainAccess 库将加密密钥保存在密钥串中访问上。它允许您使用多个 realm 文件来隔离用户数据,并通过创建线程安全的执行克隆连接来进行操作。

示例

要运行示例项目,首先克隆仓库,然后从 Example 目录中运行 pod install

要求

安装

RSRealmHelper 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中

pod 'RSRealmHelper'

使用

您可以直接使用该库,无需初始设置。

实体

按照Realm 文档中的说明创建自己的实体,例如 EmployeeRealm

import RealmSwift

final class EmployeeRealm: Object {

    @objc dynamic var id = Int()
    @objc dynamic var name = String()

    override static func primaryKey() -> String? {
        return "id"
    }

}

RealmHelper 实例

RealmHelper 实例使您可以为特定目的创建 realm 实例。您可以创建默认、自定义或内存实例,但只有默认和自定义实例使用加密。

在您的本地数据管理类上创建 RealmHelper 以管理数据库上的对象。
您可以创建数据库的默认实例。

let realmHelper = RealmHelper()
let realmHelper = RealmHelper(realmInstance: .default)

使用自定义类型,您可以将用户数据分离到特定的文件中,与其他数据隔离。

let instanceName = "user_123"
let realmInstance = RealmFactory.Instance.custom(name: instanceName)
let realmHelper = RealmHelper(realmInstance: realmInstance)

或者,您可以为测试目的在内存中创建数据库。

let realmHelper = RealmHelper(realmInstance: .inMemory)

保存/更新对象

您可以使用 RealmHelper 通过简单调用带实体作为参数的 saveupdate 函数来保存或更新实体。但是,要更新实体,它需要实现主键并且尚未附加到 realm

let employee = EmployeeRealm()
try! realmHelper.save(employee)
try! realmHelper.update(employee)

如果您需要增加您的标识符,这通常是的 primary key 属性,您需要调用一个具有您想要增加的参数名称的函数。

let employee = EmployeeRealm()
try! realmHelper.save(employee, incrementProperty: "id")

要更新附加的 realm 对象,您需要打开写入块并更新属性。
写入块发送 realm 实例,以防您需要创建某些特定内容。

let employee = EmployeeRealm()
try! realmHelper.save(employee)
try! realmHelper.writeInRealm { realm in
    employee.name = "new name"
}

获取/计数对象

RealmHelper 提供一些函数来帮助您编写更具可读性的代码,因为它与泛型和类型推断一起工作。

// Count employees in database  
let count = realmHelper.count(ofType: EmployeeRealm.self)

// get all employees saved on database
let employeeList: [EmployeeRealm] = realmHelper.findAll()

// Get first employee saved on database
let employee: EmployeeRealm? = realmHelper.findFirst()

// Create a query
let predicate = NSPredicate(format: "id == %d", id)

// Count all employees that matches with your query
let count = realmHelper.count(withPredicate: predicate, ofType: EmployeeRealm.self)

// get all employees that matches with your query
let employeeList: [EmployeeRealm] = realmHelper.findAll(withPredicate: predicate)

// Get first employee that matches with your query
let employee: EmployeeRealm? = realmHelper.findFirst(withPredicate: predicate)

删除对象

RealmHelper 提供两种删除对象的方法,一种是简单删除,另一种是级联删除,可以删除元素及其子元素。

要简单删除,可以调用 delete 函数。

// Delete a single element
let employee = EmployeeRealm()
try! realmHelper.delete(employee)

// Delete a list of elements
let employeeList: [EmployeeRealm] = [EmployeeRealm(), EmployeeRealm()]
realmHelper.delete(elements: employeeList)

// Delete all elements in table
try! realmHelper.deleteAll(type: EmployeeRealm.self)

如果您需要使用级联方法删除实体,需要在您的实体中实现 CascadeDeletable 协议来映射需要一起删除的属性

final class CompanyRealm: Object {

    @objc dynamic var id = Int()
    @objc dynamic var name = String()
    var employeeList = List<EmployeeRealm>()

}

// MARK: - CascadeDeletable
extension CompanyRealm: CascadeDeletable {

    var objectsForCascadeDelete: [Object] {
        var objects: [Object] = []
        objects.append(contentsOf: employeeList.toArray())
        return objects
    }

    static var typesForCascadeDelete: [Object.Type] {
        return [EmployeeRealm.self]
    }
}

然后需要调用函数 cascadingDelete 代替 delete 函数。

try! realmHelper.cascadingDelete(company)

如果您需要删除整个数据库,可以调用

try! realmHelper.clearDatabase()

线程安全

要使用相同的辅助实例在不同线程中调用 RealmHelper 的函数,您需要在函数调用之前克隆辅助实例。

DispatchQueue.main.async {
    let threadSafeRealmHelper = self.realmHelper.clone()
    let companyList: [CompanyRealm] = threadSafeRealmHelper.findAll()
    print("Thread safe sample: \(companyList)")
}

调试

将属性 RealmFactory.enableDebug 设置为启用/禁用调试消息

RealmFactory.enableDebug = true

迁移

要在数据库中执行 Realm 迁移,您需要在项目中添加一个 key 到 info.plist,命名为 DATABASE_SCHEMA_VERSION,并指定您的数据库模式版本的数值。

创建一个实现 RealmMigrator 协议的类

class MyRealmMigrator: RealmMigrator {

    func execute(migration: Migration, realmInstance: RealmFactory.Instance, oldVersion: UInt64, currentVersion: UInt64) {

    }

}

您必须在 RealmFactory 类上设置实现 RealmMigrator 协议的新类。

RealmFactory.realmMigrator = MyRealmMigrator()

鸣谢

RSRealmHelper 由 redspark 拥有和维护。

贡献者

Marcus Costa - [email protected] Andre M. Della Torre - [email protected]

许可证

RSRealmHelper 遵循 MIT 许可证。请参阅 LICENSE 文件获取更多信息。