如何将托管对象上下文分配给 iOS 中的应用程序委托?

Posted

技术标签:

【中文标题】如何将托管对象上下文分配给 iOS 中的应用程序委托?【英文标题】:How to assign a managed object context to the application delegate in iOS? 【发布时间】:2011-11-10 07:18:08 【问题描述】:

我用一个实体创建了一个 ios 项目和一个托管对象模型 (Model.xcdatamodeld)。在application:didFinishLaunchingWithOptions: 中,我想测试托管对象模型是否存在,但是我得到了nil。在创建托管对象模型后,是否必须做一些特殊的事情来创建托管对象上下文?

关于我可能做错的任何建议?

这是界面

@interface AppDelegate : UIResponder <UIApplicationDelegate>




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

@end

这是实现文件

#import "AppDelegate.h"
#import "RootViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize navigationController = _navigationController;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    if (![self managedObjectContext]) 
    
        NSLog(@"Does not exist");
    

    return YES;

【问题讨论】:

【参考方案1】:

旧 Xcode 自己为 CoreData 生成适当的代码。贴在下面:

#pragma mark - Core Data stack

/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
 */
- (NSManagedObjectContext *)managedObjectContext

    if (__managedObjectContext != nil)
    
        return __managedObjectContext;
    

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    
    return __managedObjectContext;


/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel

    if (__managedObjectModel != nil)
    
        return __managedObjectModel;
    
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"iDocs" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;


/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

    if (__persistentStoreCoordinator != nil)
    
        return __persistentStoreCoordinator;
    

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"iDocs.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.

         Typical reasons for an error here include:
         * The persistent store is not accessible;
         * The schema for the persistent store is incompatible with current managed object model.
         Check the error message to determine what the actual problem was.


         If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

         If you encounter schema incompatibility errors during development, you can reduce their frequency by:
         * Simply deleting the existing store:
         [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

         * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
         [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

         Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
        

    return __persistentStoreCoordinator;

【讨论】:

嗯,好的。我从一个非核心数据项目开始,所以从来没有为我创建过这些方法。我只是认为创建托管对象模型就足够了。谢谢。 您在类中定义了可用于引用托管对象模型/上下文/存储协调器对象的属性,但您没有创建任何实际对象。

以上是关于如何将托管对象上下文分配给 iOS 中的应用程序委托?的主要内容,如果未能解决你的问题,请参考以下文章

仅将托管对象上下文的新条目上传到 ios 中的服务器数据库

使用Core Data将文本从文本字段分配到托管对象上下文

批量更新后更新托管对象上下文中的托管对象

如何删除子托管对象上下文中的临时对象?

当对象的上下文不同时,如何制作 NSManagedObject 的浅拷贝?

《精通C#》第十三章 对象的生命周期