0

我正在开发一个需要使用 Core Data 的应用程序,我不禁注意到,如果您在 Xcode 中使用除 Master-Detail、Utility 或 Blank 模板之外的任何东西,则必须手动输入 Core Data。

我还注意到,为了使 Core Data 正常工作,您必须将应用程序包装在导航控制器中,并将 Core Data 的代码放在 AppDelegate 文件中。

任何人都知道解决这个问题的方法,或者这是应该的方式吗?

我的 App Delegate 看起来像这样,这三行似乎是 ManagedObjectContext 最重要的设置!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
    FBBetsViewController *controller = (FBBetsViewController *)navController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
4

2 回答 2

3

这些模板包括一些核心数据设置,但远非强制性。您可以使用任何项目中的核心数据。如果您愿意,您可以从空应用程序中获取代码,并在您的项目中使用它。

如果查看生成的代码,您将看到用于构建核心数据堆栈的三个主要组件的三个“getter”。

managedObjectModel 使用捆绑包中的模型文件创建模型。通过 New-File 并选择 Core Data Data Model 在 Xcode 中轻松创建。

persistentStoreCoordinator 使用模型和 SQL 存储。

最后,通过使用 persistentStoreCoordinator 创建 managedObjectContext。请注意,如果您愿意,您确实可以通过一种方法构建该堆栈。没有要求有这些单独的访问者......

你可以做这样的事情......

- (NSManagedObjectContext*)setupCoreDataStack
{
    // Load the model description
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"APPNAME" withExtension:@"momd"];
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    // Prepare the persistent store coordinator - needs the model
    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"APPNAME.sqlite"];
    NSError *error = nil;
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        // Handle the error !!!!!
        // exit the function
        return nil;
    }    

    // Create the managed object context.  This is what you will really
    // use in the rest of your program.
    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    return moc;
}

现在你的筹码和其他人几乎一样。唯一真正的区别是这里的 MOC 使用的是主队列并发类型,这是一个更好的选择。

如果您想拥有更好的性能模型,请插入父 moc。

实际上,如果您没有采用当前的核心数据策略,我建议您使用 UIManagedDocument。

于 2012-05-03T01:22:04.557 回答
2

Core Data 不强制你使用导航控制器,也不强制你在 AppDelegate 中设置它。通常在启动时将设置放在 AppDelegate 中,但实际上,只要确保它只初始化一次,你就可以将它移动到任何你想要的地方。

于 2012-05-02T19:57:38.253 回答