我目前正在使用this tutorial,它解释了如何将Core Data添加到现有项目中。
我赞成标题为
的部分AppDelegate.m
它说:
实现applicationDocumentsDirectory,并为每个新属性显式写入访问器方法,而不是简单地使用 @synthesize关键字。请注意persistentStoreCoordinator访问器 有一个位置,您必须在其中命名用于的SQLite文件 商店;这很可能是你的项目名称。记得 正确释放dealloc中的每个对象:
我不明白这部分要求我做什么
实现applicationDocumentsDirectory,并为每个新属性显式写入访问器方法,而不是简单地使用 @synthesize关键字。
从我可以告诉它要求我实现变量与我通常使用@synthesize的方式不同...但我不知道如何做到这一点...如果有人可以帮助我那将是很棒的
这是我的属性代码
//Core Data
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;
答案 0 :(得分:3)
我认为特定段落的含义是您需要为CoreData ivars创建自定义getter。
例如,如果您查看由Xcode创建的全新模板项目,您会注意到所有CoreData属性都设置了自定义getter,并且在您第一次访问它们时它们会懒惰地实例化/创建ivars。 / p>
例如,下面的方法检查您的managedObjectContext ivar是否不是nil,在这种情况下已经创建了上下文,因此getter方法只会将其返回给调用方法(通常是您访问{{1}带有managedObjectContext
)
self.managedObjectProperty
applicationsDocumentDirectory方法只是一种方便的方法,它返回文档目录的路径,然后持久性存储协调器将使用该路径来设置CoreData数据库文件的路径。
最好的办法是创建一个新项目,并将整个CoreData堆栈从AppDelegate复制到现有项目中。然后,您需要创建一个托管对象模型,并确保在NSManagedObjectModel方法中正确设置了名称,然后您应该好好去。
答案 1 :(得分:3)
您可以大量清理模板Core Data代码。不需要引用NSPersistentStoreCoordinator
和NSManagedObjectModel
。我倾向于将这三个方法汇总到一个方法中,以使代码更简洁。
@interface AppDelegate()
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@implementation AppDelegate
@synthesize managedObjectContext = $managedObjectContext;
- (NSManagedObjectContext *)managedObjectContext
{
if ($managedObjectContext) return $managedObjectContext;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Example" withExtension:@"momd"];
NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSAssert1(mom, @"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd));
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *libraryURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *url = [libraryURL URLByAppendingPathComponent:@"Example.storedata"];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSAssert(coordinator, @"Failed to initialize coordinator");
NAssert1([coordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&error], @"Error: %@", error);
$managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[$managedObjectContext setPersistentStoreCoordinator:coordinator];
return $managedObjectContext;
}
使用该代码,您有一个处理ivar的类继续。我们使用合成,以便我们可以直接与get访问器中的ivar对话。
由于可以通过MOC访问MOM和PSC,因此无需对它们进行额外的引用。
答案 2 :(得分:1)
即使使用@property
声明,您仍然可以按照自己的意愿实现访问者。
- (NSString *)applicationDocumentsDirectory {
return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}