测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可协议 | MIT |
Released最后发布 | 2017年11月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 Rob Nash 维护。
一个用于基本CoreData数据库任务的轻量级便利API。运行RecordsDemo
Xcode方案以进行演示。
不支持标量或可转换类型
考虑以下数据库模式。
一个用于实体'Performer'的类,可能如下所示。
import Foundation
import CoreData
import Records
@objc(Performer)
public class Performer: NSManagedObject, Fetchable {
@NSManaged public var dob: Date
@NSManaged public var firstName: String
@NSManaged public var lastName: String
@NSManaged public var party: Party
@NSManaged public var performances: Set<Performance>?
}
// sourcery:inline:Performer.ManagedObject.Query.stencil
// sourcery:end
通过声明遵守Fetchable
并为sourcery添加注释标记,您将获得以下自动完成的语法(在编译后)。
let query = Performer.Query(dob: nil, firstName: "Maggie", lastName: nil, party: nil, performances: nil) // Fetch all with first name that BEGINSWITH[cd] `Maggie`
let performers: [Performer] = try! query.all(in: context)
享受吧!
但是等等?...sourcery是什么?
Sourcery是一个可选的与该框架一起使用的模板生成工具。提供一个预先编写的模板文件在此处,该文件将指导sourcery为任何实现Fetchable
的NSManagedObject子类编写'Query'语法。
您对CoreData模式所做的任何更改都会触发模板代码的重新生成。例如,如果您从Performer删除了属性`lastName`,则新的初始化器将如下所示。
let query = Performer.Query(dob: nil, firstName: "Maggie", party: nil, performances: nil)
let performers: [Performer] = try! query.all(in: context)
Xcode编译器将在编译时突出显示更改后的初始化器。评估受您模式更改影响的每个调用位置非常有用。
有关这些功能的详细信息,请查看RecordsDemo
目标的源代码。
多对多关系查询。
let restriction = RelationshipRestriction(operation: .allMatching, records: Set(arrayLiteral: performerA, performerB))
let query = Performance.Query(performers: restriction, event: nil, ability: nil, group: nil)
let performances: [Performance] = try! query.all(in: context)
空谓词搜索。
let performer: Performer? = try! Performer.fetchFirst(in: context)
let performer: Performer? = try! Performer.fetchFirst(in: context, sortedBy: NSSortDescriptor(key: "firstName", ascending: true))
仍可使用自定义谓词。
let performers: [Performer] = try! Performer.fetchAll(withPredicate: NSPredicate(format: "firstName CONTAINS[cd] %@", "Maggie"), in: context)
小的UIViewController子类。
import UIKit
class PerformancesViewController: UIViewController {
var fetchedResultsController: PerformancesFetchedResultsController!
@IBOutlet private weak var tableView: PerformancesTableView! {
didSet {
fetchedResultsController.delegate = tableView
fetchedResultsController.dataSource = tableView
tableView.dataSource = fetchedResultsController
tableView.delegate = fetchedResultsController
}
}
override func viewDidLoad() {
super.viewDidLoad()
title = "Performances"
fetchedResultsController.selectPerformance = { performance in
/// do something
}
}
}
使用枚举进行字符串替换。
let query = Party.Query(email: email, name: name, phone: phone, performers: nil, type: .school)
要使用枚举,请将字符串属性在您的实体子类中设为私有。然后为您创建一个枚举的var
。
import Foundation
import CoreData
import Records
@objc(Party)
public class Party: NSManagedObject, Fetchable {
@NSManaged public var email: String
@NSManaged public var name: String
@NSManaged public var phone: String
@NSManaged private var type: String
@NSManaged public var performers: Set<Performer>?
public enum PartyType: String {
case school = "School"
case independent = "Independent"
}
public var type_: PartyType {
get {
return PartyType(rawValue: type)!
}
set {
type = newValue.rawValue
}
}
}
确保在属性上设置默认值,并编写一个单元测试(见这里)。
对于最新版本,选择发布标签。
将github "rob-nash/Records"
添加到您的Cartfile
中。
将pod "Records"
添加到您的Podfile
中。
如果您喜欢这个项目并且想请我喝一杯,请使用bitcoin。
Bitcoin 地址:15Gj4DBTzSujnJrfRZ6ivrR9kDnWXNPvNQ