SugarRecord 3.1.2

SugarRecord 3.1.2

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2017 年 4 月
SPM支持 SPM

Pedro Piñera 维护。



SugarRecord

什么是 SugarRecord?

SugarRecord 是一个持久性包装库,用于简化与持久性解决方案(如 CoreData)的工作方式。得益于 SugarRecord,您只需几行代码即可使用 CoreData:只需选择您的堆栈并开始玩转您的数据。

该库由 @carambalabs 维护。您可以通过 [email protected] 获取帮助或对库的任何意见和建议。

paypal

功能

  • Swift 3.0 兼容(Xcode 8.0)。
  • 基于协议的设计。
  • 面向 初学者高级用户
  • 完全可定制。构建您自己的堆栈!
  • 友好语法(流畅)
  • 远离 Singleton 模式!无共享状态🎉
  • 兼容 OSX/iOS/watchOS/tvOS
  • 完全测试(感谢 Nimble 和 Quick)
  • 积极支持

设置

响应式编程

我们为 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
}
创建一个 iCloud 存储

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 的包装器。可用的上下文包括:

  • 主上下文:用于主线程操作,例如要在UI中呈现的数据的获取。
  • 保存上下文:用于后台操作。当创建存储实例时初始化上下文。该上下文用于存储操作。
  • 内存上下文:当你想要进行一些测试且不希望你的更改持久化时使用此上下文。

获取数据

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 提供直接的 insertdeletion 方法,但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使用更简单、更有趣、更愉快相关的事情都是受欢迎的!🎉

RequestObservable

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 资助和维护。我们💛开源软件!

查看我们其他的开源项目 (点击访问),阅读我们的 博客 或者👋在推特上关注我们 @carambalabs

贡献

欢迎贡献🤘我们鼓励开发者像您一样,帮助我们改进与社区共享的项目。请参阅贡献指南行为准则

许可

MIT 许可证 (MIT)

版权所有 <2014>

在此特此免费许可任何获得本软件及其相关文档文件(以下称为“软件”)副本的人,有权在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供的人做此类事情,但需遵守以下条件

必须在所有副本或实质部分中包含上述版权声明和本许可声明。

软件按“现状”提供,不提供任何形式的质量保证,无论是否明确或暗示,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不应对任何主张、损害或其他责任负责,无论是否基于合同、侵权或其他原因, arising from, out of or in connection with the Software or the use or other dealing with the Software.