CoreDataを簡単に扱うためのフレームワーク
Carthageが利用可能です。Cartfileに以下の行を追加してください。
github "masakih/Doutaku"
「use Core Data」を選択する必要はありません。
モデルファイルは普通に作ってください
エンティティも普通に作ってください。 この時、クラス名とエンティティ名を一致させておくと後が楽です。 Codegenは Manual/None または Class Definition を指定します。 Intの扱いを考えると Manual/None がおすすめです。
import Doutaku
class Person: NSManagedObject {
@NSManaged public var name: String?
@NSManaged public var identifier: Int
}
extension Person: Entity {}
Doutakuをインポートし Entity プロトコルに準拠させます。
以下は Model.xcdatamodeld を使用する場合の例です。 通常はこれだけでOKです。
struct Model: CoreDataManager {
static let core = CoreDataCore(CoreDataConfiguration("Model"))
static let `default` = Model(type: .reader)
let context: NSManagedObjectContext // Use ONLY for CocoaBindings to NSObjectController.
init(type: CoreDataManagerType) {
context = Model.context(for: type)
}
}
データストアファイルは~/Library/Application Support/{Your Application Bundle Identifier}/Model.storedata
あるいはサンドボックス内の同じ場所に保存されます。
// 編集用のModelのインスタンスを取得
let model = Model.oneTimeEditor()
defer { model.save() }
// NSManagedObjectContextの所有するqueueで実行
model.sync {
// 新しいPersonをインサート
let person = model.insertNewObject(for: Person.self)
person?.name = name
person?.identifier = model.nextIdentifier()
}
extension Model {
// 利用可能なidentifierを取得
func nextIdentifier() -> Int {
return sync {
let sortDesc = SortDescriptors(keyPath: \Person.identifier, ascending: true)
// すべてのPersonをidentifierの順で取得
let persons = try? objects(of: Person.self, sortDescriptors: sortDescs)
return (persons?.first?.identifier ?? 0) + 1
}
}
}
let selections: [Person] = // Person Objects under OTHER Model instance.
let editorModel = Model.oneTimeEditor()
defer { editorModel.save() }
editorModel.sync {
selections
.flatMap(editorModel.exchange) // 他のModelの管理下にあるPersonをeditorModelの管理下のインスタンスに変換
.forEach(editorModel.delete) // 削除
}