核心数据 - 上下文为空

时间:2014-07-19 20:42:30

标签: ios objective-c core-data

我想使用CoreData。一段时间后,我已经手动创建了这个coreData文件。我正在尝试将一些值写入文件,但上下文始终为null。

- (NSManagedObjectContext *)managedObjectContext {

    NSManagedObjectContext *context = nil;
    AppDelegate *delegate = [[UIApplication sharedApplication] delegate];


        context = [delegate managedObjectContext];
    if(context == nil)
    {
        NSLog(@"CONTEXT IS NIL");
    }

    return context;
}

方法没有错误,但崩溃了:

//here is null
NSManagedObjectContext *context = [self managedObjectContext];

    // Create a new managed object
    NSManagedObject *newDevice = [NSEntityDescription insertNewObjectForEntityForName:@"Kwejki" inManagedObjectContext:context];

上下文为空。如果我从AppDelegate对象获取此上下文,我不知道为什么它为null。我在我的应用程序中使用TabBarController,它在第一个选项卡中启动。有什么问题?

UPDATE ::

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (NSManagedObjectContext *)managedObjectContext {

    if (self.managedObjectContext != nil) {
        return self.managedObjectContext;
        NSLog(@"managedOC - != nil");
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        NSLog(@"coordinator - != nil");
//Here I get two errors below "Receiver type NSManagedObjectContext for instance message is a forward declaration"

        self.managedObjectContext = [[NSManagedObjectContext alloc] init];
        [self.managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return self.managedObjectContext;
}

2 个答案:

答案 0 :(得分:0)

您应该使用实例变量进行延迟实例化。只需从Xcode模板中复制应用程序代理代码(无论何时检查"使用核心数据")。你为什么一开始就改变它?

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

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

答案 1 :(得分:0)

我遇到了同样的问题,看起来我在获取NSManagedObjectContext时遇到了一些问题

 lazy var coreDataContext : NSManagedObjectContext = {
    (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
}()

但是我的错误是我在 xcdatamodeld 文件中使用了不同的实体名称,并且在访问它的代码中我使用了不同的实体名称。因此,请确保我们也使用相同的实体名称,否则它将引发一些错误。

enter image description here

在访问它时,我的差别很小

enter image description here