子上下文新的托管对象

时间:2015-08-13 15:05:30

标签: core-data parent-child nsmanagedobject nsmanagedobjectcontext

我试图使用子上下文,所以我可以使用NSManagedObject的子类作为普通类来保存信息。就像一个便笺簿......

目标:NSManagedObject

+ (Target*)initWithCoreData{

NSManagedObjectContext * context = [[CoreDataWrapper sharedInstance] childManagedObjectContext];

NSEntityDescription * ent= [NSEntityDescription insertNewObjectForEntityForName:@"Target"
                                               inManagedObjectContext:context];

Target * target = [[Target alloc] initWithEntity:ent insertIntoManagedObjectContext:context];

return target;
}

pragma mark - 核心数据

/**
 *  Path for Core Data Store Files
 *
 *  @return Path for Core Data Store Files
 */
- (NSURL *)applicationDocumentsDirectory {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "com.aigptc.MSA" in the application's documents directory.
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

/**
 *  Create ManagedObjectModel if it doesn't exist already
 *
 *  @return ManagedObjectModel used with CoreData
 */
- (NSManagedObjectModel *)managedObjectModel {
    // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MSA" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}


/**
 *  Return the NSPersistenceStoreCoordinator used in CoreData if it does'nt exist
 *  with the options: dictionaryWithObjectsAndKeys and NSMigratePersistentStoresAutomaticallyOption set to YES
 *
 *  @return PersistanceStoreCoordinator used by CoreData
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    // Create the coordinator and store

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MSA.sqlite"];
    NSError *error = nil;
    NSString *failureReason = @"There was an error creating or loading the application's saved data.";

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];


    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        // Report any error we got.
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
        dict[NSLocalizedFailureReasonErrorKey] = failureReason;
        dict[NSUnderlyingErrorKey] = error;
        error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
        // Replace this 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.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

/**
 *  Creates NSManagedObjectContext for CoreData
 *
 *  @return NSManagedObjectContext for CoreData
 */

- (NSManagedObjectContext *)managedObjectContext {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) {
        return nil;
    }
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
}

/**
 *  Creates NSManagedObjectContext for CoreData
 *
 *  @return NSManagedObjectContext for CoreData
 */

- (NSManagedObjectContext *)childManagedObjectContext {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_childManagedObjectContext != nil) {
        return _childManagedObjectContext;
    }

    _childManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    NSManagedObjectContext * cont = [self managedObjectContext];

    [_childManagedObjectContext setParentContext:cont];

    return _childManagedObjectContext;
}

程序在行中崩溃:

Target * target = [[Target alloc] initWithEntity:ent insertIntoManagedObjectContext:context];

出现以下错误:

2015-08-13 15:52:51.720 MSA[3262:71338] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Target managedObjectModel]: unrecognized selector sent to instance 0x7ffa28e506a0'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010c751c65 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x000000010c02ebb7 objc_exception_throw + 45
    2   CoreFoundation                      0x000000010c7590ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010c6af13c ___forwarding___ + 988
    4   CoreFoundation                      0x000000010c6aecd8 _CF_forwarding_prep_0 + 120
    5   CoreData                            0x000000010c27fea3 -[NSManagedObject initWithEntity:insertIntoManagedObjectContext:] + 83
    6   MSA                                 0x00000001090db227 +[Target initWithCoreData] + 183
    7   MSA                                 0x00000001090db32a +[Target setTarget:new:targetISO:lastUpdate:] + 154
    8   MSA                                 0x00000001090c53bb -[MSASetTargetView applyTargetButton:] + 651
    9   UIKit                               0x0000000109bfbd62 -[UIApplication sendAction:to:from:forEvent:] + 75
    10  UIKit                               0x0000000109d0d50a -[UIControl _sendActionsForEvents:withEvent:] + 467
    11  UIKit                               0x0000000109d0c499 -[UIControl touchesBegan:withEvent:] + 224
    12  UIKit                               0x0000000109c487be -[UIWindow _sendTouchesForEvent:] + 325
    13  UIKit                               0x0000000109c49282 -[UIWindow sendEvent:] + 682
    14  UIKit                               0x0000000109c0f541 -[UIApplication sendEvent:] + 246
    15  UIKit                               0x0000000109c1ccdc _UIApplicationHandleEventFromQueueEvent + 18265
    16  UIKit                               0x0000000109bf759c _UIApplicationHandleEventQueue + 2066
    17  CoreFoundation                      0x000000010c685431 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    18  CoreFoundation                      0x000000010c67b2fd __CFRunLoopDoSources0 + 269
    19  CoreFoundation                      0x000000010c67a934 __CFRunLoopRun + 868
    20  CoreFoundation                      0x000000010c67a366 CFRunLoopRunSpecific + 470
    21  GraphicsServices                    0x000000010f581a3e GSEventRunModal + 161
    22  UIKit                               0x0000000109bfa8c0 UIApplicationMain + 1282
    23  MSA                                 0x00000001090e798f main + 111
    24  libdyld.dylib                       0x000000010d6da145 start + 1
    25  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我不知道我做错了什么......我在网上找到的所有内容都与其自身的背景创造有关。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我找到了答案!我正在创建目标错误,它应该是:

+ (Target*)initWithCoreData{

NSManagedObjectContext * context = [[CoreDataWrapper sharedInstance] childManagedObjectContext];

Target * target = [NSEntityDescription insertNewObjectForEntityForName:@"Target"
                                               inManagedObjectContext:context];


return target;
}