【问题标题】:How to add Core Data to an existing project?如何将 Core Data 添加到现有项目中?
【发布时间】:2011-12-31 17:46:28
【问题描述】:

我目前正在通过this tutorial 工作,它解释了如何将核心数据添加到现有项目。

我完成了标题为

的部分

AppDelegate.m

上面写着:

实现 applicationDocumentsDirectory,并为每个新属性显式编写访问器方法,而不是简单地使用 @synthesize 关键字。注意persistentStoreCoordinator 访问器 有一个位置,您必须在其中命名用于 店铺;这很可能是您的项目名称。记得 正确释放 dealloc 中的每个对象:

我不明白这部分要求我做什么

实现 applicationDocumentsDirectory,并为每个新属性显式编写访问器方法,而不是简单地使用 @synthesize 关键字。

据我所知,它要求我以不同于我通常使用@synthesize 执行它们的方式来实现变量.. 但我不知道该怎么做……如果有人可以帮助我,那就太棒了.

这是我的房产代码

//Core Data
@property (nonatomic, strong, readonly) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong, readonly) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator;

【问题讨论】:

  • opps.. 抱歉,我错过了什么?
  • 没什么,只是文本格式(引用而不是代码)

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


【解决方案1】:

你可以清理很多模板核心数据代码。不需要对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】:

    我认为该特定段落的意思是您需要为您的 CoreData ivars 创建自定义 getter。

    例如,如果您查看由 Xcode 创建的全新模板项目,您会注意到所有 CoreData 属性都设置了自定义 getter,并且它们会在您第一次访问它们时懒惰地实例化/创建 ivars。

    例如,下面的方法检查您的 managedObjectContext ivar 是否不为零,在这种情况下,上下文已经创建,因此 getter 方法将简单地将其返回给调用方法(通常是您访问 managedObjectContext 属性self.managedObjectProperty)

    - (NSManagedObjectContext*)managedObjectContext
    {
        if (_managedObjectContext != nil)
           return _managedObjectContext
        _managedObjectContext = ...
    }
    

    applicationsDocumentDirectory 方法只是一个方便的方法,它返回文档目录的路径,然后您的持久存储协调器将使用该路径为您的 CoreData 数据库文件设置路径。

    最好的办法是创建一个新项目并将整个 CoreData 堆栈从 AppDelegate 复制到现有项目中。然后,您将需要创建一个托管对象模型并确保您在 NSManagedObjectModel 方法中正确设置了名称,然后您就可以开始了。

    【讨论】:

    • 正确。真是太痛苦了……哈哈,好吧,我很快就会尝试一下……我想你是为了概述正在发生的事情。
    • @C.Johns CoreData 很棒,但是启动和运行所需的样板文件是一件很痛苦的事情。看看 MagicalRecord 一个很棒的框架,它让你很容易上手。我仍然建议您在进入 MagicalRecord 之前更好地了解幕后发生的事情,但一定要试一试。
    • 干杯。是的,我潜意识里想,到目前为止,我一直在努力避免使用 coredata。我终于到了我决定需要它的地步。所以是的,现在就尝试进入它,但是在幕后做了很多工作很难理解到底发生了什么.. 但我肯定会到达那里。感谢您的帮助。
    【解决方案3】:

    即使使用@property 声明,您仍然可以随意实现访问器。

    - (NSString *)applicationDocumentsDirectory {
        return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    }
    

    【讨论】:

    • 所以我不需要@synthesize?我在头文件中有@property 声明吗?
    • 疯了。因为 atm 我在整个节目中都遇到了错误。根据我有限的经验,奇怪的东西应该有效,但不是。
    猜你喜欢
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多