如何将Core Data添加到现有项目?

时间:2011-11-17 21:10:06

标签: iphone objective-c cocoa-touch core-data

我目前正在使用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;

3 个答案:

答案 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代码。不需要引用NSPersistentStoreCoordinatorNSManagedObjectModel。我倾向于将这三个方法汇总到一个方法中,以使代码更简洁。

@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];
}