SugarRecord 是一个持久性包装库,用于简化与持久性解决方案(如 CoreData)的工作方式。得益于 SugarRecord,您只需几行代码即可使用 CoreData:只需选择您的堆栈并开始玩转您的数据。
该库由 @carambalabs 维护。您可以通过 [email protected] 获取帮助或对库的任何意见和建议。
我们为 SugarRecord 提供扩展,提供对库的响应式接口
您可以在以下位置检查生成的 SugarRecord 文档 here,它是自动生成的,与 CocoaDocs 一同生成
存储代表了您的数据库。开始使用 SugarRecord 的第一步是初始化存储。SugarRecord 提供了一个默认存储,CoreDataDefaultStorage
。
// Initializing CoreDataDefaultStorage
func coreDataStorage() -> CoreDataDefaultStorage {
let store = CoreData.Store.Named("db")
let bundle = Bundle(forClass: self.classForCoder())
let model = CoreData.ObjectModel.merged([bundle])
let defaultStorage = try! CoreDataDefaultStorage(store: store, model: model)
return defaultStorage
}
SugarRecord 支持将 CoreData 与 iCloud 进行集成。由于它实现了自己的存储,您可以从中使用应用,因此设置起来非常简单,这个存储是 CoreDataiCloudStorage
。
// Initializes the CoreDataiCloudStorage
func icloudStorage() -> CoreDataiCloudStorage {
let bundle = Bundle(forClass: self.classForCoder())
let model = CoreData.ObjectModel.merged([bundle])
let icloudConfig = CoreDataiCloudConfig(ubiquitousContentName: "MyDb", ubiquitousContentURL: "Path/", ubiquitousContainerIdentifier: "com.company.MyApp.anothercontainer")
return CoreDataiCloudStorage(model: model, iCloud: icloudConfig)
}
存储提供多种上下文,这些上下文是进入数据库的入口点。对于好奇心旺盛的开发者,如果我们讨论CoreData,上下文是围绕 NSManagedObjectContext
的包装器。可用的上下文包括:
let pedros: [Person] = try! db.fetch(FetchRequest<Person>().filtered(with: "name", equalTo: "Pedro"))
let tasks: [Task] = try! db.fetch(FetchRequest<Task>())
let citiesByName: [City] = try! db.fetch(FetchRequest<City>().sorted(with: "name", ascending: true))
let predicate: NSPredicate = NSPredicate(format: "id == %@", "AAAA")
let john: User? = try! db.fetch(FetchRequest<User>().filtered(with: predicate)).first
虽然 Context
提供直接的 insert
和 deletion
方法,但SugarRecords旨在使用存储提供的 operation
方法执行涉及数据库模型修改的操作。
save()
方法,否则应用于上下文的所有更改都处于内存状态。该方法将更改持久化到你的存储库,并将它们传播到所有可用的上下文。do {
db.operation { (context, save) throws in
// Do your operations here
try save()
}
} catch {
// There was an error in the operation
}
你可以使用上下文的 new()
方法初始化一个模型,而无需将其插入上下文。
do {
db.operation { (context, save) throws in
let newTask: Track = try context.new()
newTask.name = "Make CoreData easier!"
try context.insert(newTask)
try save()
}
} catch {
// There was an error in the operation
}
为了将模型插入上下文,你使用
insert()
方法。
你可以使用 create()
方法在一个操作中初始化并插入上下文。
do {
db.operation { (context, save) throws -> Void in
let newTask: Track = try! context.create()
newTask.name = "Make CoreData easier!"
save()
}
}
catch {
// There was an error in the operation
}
你可以类似地使用上下文中的 remove()
方法,并传递你想要从数据库中删除的对象。
do {
db.operation { (context, save) throws in
let john: User? = try context.request(User.self).filteredWith("id", equalTo: "1234").fetch().first
if let john = john {
try context.remove([john])
try save()
}
}
} catch {
// There was an error in the operation
}
这是SugarRecord对接口的第一种方法。我们将根据你的反馈和框架的使用情况进行改进。请不要犹豫,联系我们提出你的建议。任何与使CoreData使用更简单、更有趣、更愉快相关的事情都是受欢迎的!
🎉
SugarRecord提供了一个组件,RequestObservable
,它允许观察数据库的变化。它使用了底层的 NSFetchedResultsController
。
观察
class Presenter {
var observable: RequestObservable<Track>!
func setup() {
let request: FetchRequest<Track> = FetchRequest<Track>().filtered(with: "artist", equalTo: "pedro")
self.observable = storage.instance.observable(request)
self.observable.observe { changes in
case .Initial(let objects):
print("\(objects.count) objects in the database")
case .Update(let deletions, let insertions, let modifications):
print("\(deletions.count) deleted | \(insertions.count) inserted | \(modifications.count) modified")
case .Error(let error):
print("Something went wrong")
}
}
}
保留:在观察生命周期中必须保留RequestObservable。当
RequestObservable
实例从内存中释放时,它会停止从你的存储中观察更改。注意:这已从 Observable 重命名为 RequestObservable,因此我们不再占用RxSwift Observable命名空间。
RequestObservable
不适用于 CoreData + OSX
此项目由 Caramba 资助和维护。我们
查看我们其他的开源项目 (点击访问),阅读我们的 博客 或者
欢迎贡献
MIT 许可证 (MIT)
版权所有 <2014>
在此特此免费许可任何获得本软件及其相关文档文件(以下称为“软件”)副本的人,有权在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供的人做此类事情,但需遵守以下条件
必须在所有副本或实质部分中包含上述版权声明和本许可声明。
软件按“现状”提供,不提供任何形式的质量保证,无论是否明确或暗示,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不应对任何主张、损害或其他责任负责,无论是否基于合同、侵权或其他原因, arising from, out of or in connection with the Software or the use or other dealing with the Software.