【问题标题】:iOS: Problem with the NSManagedObjectContext / NSFetchRequest / NSEntityDescriptioniOS:NSManagedObjectContext / NSFetchRequest / NSEntityDescription 的问题
【发布时间】:2018-09-17 14:37:07
【问题描述】:

我有一条错误消息 ' 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:' -[__NSArrayM insertObject:atIndex:]: object cannot是零'

问题出在 fetchedObjects 上。

这是因为它试图将 nil 值添加到 NSArray。我不明白的是,为什么会有那个空值。

供参考:表是我的sqlite表的名称,标签只是我表的一个字段。

- (NSMutableArray*) getLabel:(NSString *)label fromTable:(NSString *)table 
{
    NSMutableArray * ret = [NSMutableArray new];
    NSError *error = nil;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:table
                                              inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

    Class theClass = NSClassFromString(table);
    id info = [[theClass alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];

    for (info in fetchedObjects)
    {
        [ret addObject:[info valueForKey: label]];
    }
    return ret;
}

初始化良好:

初始化错误:

你有什么想法吗? 提前致谢。

【问题讨论】:

  • 没什么奇怪的,刚才分配的对象有空字段。
  • 在将对象添加到数组或字典之前,您应该始终检查它是否为 nil。那里没有足够的信息来理解为什么 [info valueForKey: label] 为 nil。我们需要查看创建托管对象并将其存储在数据库中的代码。我们还需要知道 'label' 的值。
  • @Cy-4AH 我没听懂,什么意思?
  • @Dimitar08 我知道我必须检查nil,但我的问题不是要避免nil,而是要解释它。我不想把灰尘藏在地毯下……如果有帮助的话,我会把更多的信息放在票里。
  • 仔细查看代码后,Cy-4AH 是正确的。您的代码正在创建一个新的托管对象。有意义的是,此时对象上的任何字段都不会填充数据。

标签: ios objective-c nsmanagedobject nsmanagedobjectcontext nsfetchrequest


【解决方案1】:

这是一个常见的错误。我认为你应该看看你的台词:

id info = [[theClass alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];

如果您想了解更多信息,请看这里:Use NSManagedObject class without initWithEntity:?

你应该 insertIntoManagedObjectContect:nil

【讨论】:

  • 哦,非常感谢,我到处找,原来如此简单!非常感谢,您节省了我的一周 :D (正因为如此,它添加了行和行。很奇怪,为了初始化变量,我需要使用 insertIntoMAnagedObjectContext ...,因为我尝试了简单的 initWithEntity: 并没有'不工作)
  • 我认为他只需要for (id info in fetchedObjects) 而没有任何insertIntoManagedObjectContect
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多