描述
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 通过简单调用带实体作为参数的 save
或 update
函数来保存或更新实体。但是,要更新实体,它需要实现主键并且尚未附加到 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 文件获取更多信息。