这是苹果官方文档 Core Data Programming Guide 的渣翻译。
当你在应用中定义了托管对象模型(MOM)并初始化了Core Data栈,你就可以开始创建数据存储对象了。
创建托管对象(MO)
一个NSManagedObject实例实现了基本的Core Data模型对象的需求。MO实例需要两个要素:一个Entity描述(一个NSEntityDescription实例),和一个托管对象上下文(一个NSManagedObjectContext实例)。Entity描述包含类代表的Entity的名字、字段和关系。MOC代表了一个你用来创建MO的草稿板。MOC能跟踪修改和对象之间的关系。
在这个例子中,NSEntityDescription类有一个类方法,这个方法接收一个string座位Entity的名字、一个MO绑定的MOC的引用。这个例子定义了返回对象为AAAEmployeeMO对象。
OBJECTIVE-C
AAAEmployeeMO *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:[self managedObjectContext];
SWIFT
let employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: self.managedObjectContext) as! AAAEmployeeM
创建NSManagedObject的子类
默认Core Data会返回NSManagedObject实例给你的应用。但是如果为每个模型中的Entity定义一个NSManagedObject无疑是更有用的。特别是当你创建了一个NSManagedObject的子类,可以利用代码自动完成来更好地调用属性和方法。
在Xcode的Core Data编辑器中创建一个NSManagedObject的子类,在数据模型配置器的Entity编辑框,选择一个Entity,输入类名,这样就完成了创建。
OBJECTIVE-C
#import <CoreData/CoreData.h>
@interface AAAEmployeeMO : NSManagedObject
@property (nonatomic, strong) NSString *name;
@end
@implementation AAAEmployeeMO
@dynamic name;
@end
SWIFT
import UIKit
import CoreData
import Foundation
class AAAEmployeeMO: NSManagedObject {
@NSManaged var name: String?
}
@dynamic标签通知编译器这个变量会在运行时再进行解析。
当这个子类在数据模型定义了并添加到了应用中,你就可以直接在应用中引用,提升你应用代码的可读性。
保存NSManagedObject实例
NSManagedObject实例的创建不能持久化。当你在MOC中创建了一个MO,你必须保存这个修改到持久化存储中。
OBJECTIVE-C
NSError *error = nil;
if ([[self managedObjectContext] save:&error] == NO) {
NSAssert(NO, @"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]);
}
SWIFT
do {
try managedObjectContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}
NSManagedObjectContext上save操作的调用接收一个NSError变量,无论是成功还是失败都会返回。如果保存失败,为了能纠正,能够显示出错误原因是十分重要的。错误原因的显示可以输出到控制台或者显示给用户。如果保存方法返回成功,这个错误变量不需要进行考虑。