【问题标题】:Core data - context is null核心数据 - 上下文为空
【发布时间】:2014-07-19 20:42:29
【问题描述】:

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

- (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 对象获取此上下文,我不知道为什么它为空。我在我的应用程序中使用 TabBarController,它从第一个选项卡开始。怎么了?

更新::

@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;
}

【问题讨论】:

  • 请从 AppDelegate managedObjectContext 方法中发布代码。
  • ...如果您是我的员工,请解释为什么您显然认为将应用程序委托用作包罗万象的单例是合适的。我怀疑这不是一个有用的评论。
  • 我已经更新了帖子。我仍在学习目标 - C @Tommy,我是第一次使用 CoreData。
  • 我可能错了,但消息“接收器类型 NSManagedObjectContext 例如消息是前向声明”向我表明您忘记导入核心数据标头。
  • 是的,我已经导入了那个库并且错误消失了

标签: ios objective-c core-data


【解决方案1】:

您应该使用实例变量进行延迟实例化。只需从 Xcode 模板复制应用程序委托代码(无论何时选中“使用核心数据”)。当初为什么要改?

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

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

【讨论】:

    【解决方案2】:

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

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

    但我的错误是我在 xcdatamodeld 文件中有不同的实体名称,而在访问它时我使用的代码不同。所以请确保我们也有相同的实体名称,否则会抛出一些错误。

    在访问它时我有一点不同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多