记录 1.0.1

记录 1.0.1

测试已测试
Lang语言 SwiftSwift
许可协议 MIT
Released最后发布2017年11月
SwiftSwift 版本4.0
SPM支持 SPM

Rob Nash 维护。



记录 1.0.1

Records

Carthage Cocoapods Build Swift Platform: iOS Twitter: @nashytitz

一个用于基本CoreData数据库任务的轻量级便利API。运行RecordsDemo Xcode方案以进行演示。

不支持标量或可转换类型

使用方法

考虑以下数据库模式。

CoreData

一个用于实体'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是一个可选的与该框架一起使用的模板生成工具。提供一个预先编写的模板文件在此处,该文件将指导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
    }
  }
  
}

确保在属性上设置默认值,并编写一个单元测试(见这里)。

安装

对于最新版本,选择发布标签。

Carthage

github "rob-nash/Records"添加到您的Cartfile中。

Cocoapods

pod "Records"添加到您的Podfile中。

捐赠

如果您喜欢这个项目并且想请我喝一杯,请使用bitcoin。

Bitcoin Image

Bitcoin 地址:15Gj4DBTzSujnJrfRZ6ivrR9kDnWXNPvNQ