【问题标题】:'+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name'+entityForName: nil 不是合法的 NSManagedObjectContext 参数搜索实体名称
【发布时间】:2015-07-06 20:28:16
【问题描述】:

我正在尝试向 CoreData 添加数据。 这是我的代码。但是我收到了这个错误。在这种情况下我该怎么办?

那是我的 ViewController.h

@interface LoginViewController : UIViewController {
    NSManagedObjectContext *managedObjectContext;

}

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

这是我的 .m 文件

       Person *person = [[Person alloc] initWithJSONString:string];
    NSManagedObjectContext *context = [self managedObjectContext];
    NSManagedObjectContext *object = [NSEntityDescription insertNewObjectForEntityForName:@"Users" inManagedObjectContext:context];
    [object setValue:person.name forKey:@"name"];
    [object setValue:person.id forKey:@"userId"];
    [object setValue:person.statu forKey:@"statu"];
    [object setValue:person.token forKey:@"token"];
    [object setValue:person.sonuc forKey:@"sonuc"];

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

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

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

这是错误。

'+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Users''

感谢您的帮助

【问题讨论】:

  • 您的实体名称可能是User(单数),而不是Users
  • 没有改变任何东西。我遇到了同样的错误。
  • + entityForName:inManagedObjectContext: 提供什么?也是nil。 (我希望这样,只是为了检查。)managedObjectContext 不是零吗?
  • [self persistentStoreCoordinator] 是否返回 nil

标签: ios objective-c json core-data


【解决方案1】:

你的问题的核心是你没有想过persistentStoreCoordinator来自哪里,这个对象永远不会被创建。

您的支票if (coordinator != nil) 隐藏了这个问题。相反,您的目标应该是设置好coordinator 永远不会是nil。然后可以删除检查,或者更好的是,将其替换为这种情况的断言:NSAssert(coordinator != nil, @"There is no persistent store coordinator.")

如果持久存储协调器来自此视图控制器之外,我建议将其作为视图控制器初始化的一部分传递。如果视图控制器可以自己设置持久存储协调器,则要么将其作为其初始化的一部分进行,要么延迟加载。

【讨论】:

    【解决方案2】:

    最好用

    NSManagedObjectContext *object = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([YourClass class]) inManagedObjectContext:context];
    

    您不需要使用硬编码字符串,因为它可能会出现输入错误。

    在你的情况下它必须是

    NSManagedObjectContext *object = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Users class]) inManagedObjectContext:context];
    

    【讨论】:

    • 感谢您的回答,但它说现在使用未声明的标识符“用户”
    • 你的班级叫什么名字?
    • 实体(类型)和类之间的关系是对多的。可以有很多实体使用同一个类,事实上这是默认的!
    猜你喜欢
    • 2014-09-28
    • 2013-12-26
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多