发送到实例错误的核心数据无法识别的选择器:并且无法在 NSManagedObject 类上调用指定的初始化程序

Posted

技术标签:

【中文标题】发送到实例错误的核心数据无法识别的选择器:并且无法在 NSManagedObject 类上调用指定的初始化程序【英文标题】:core data unrecognized selector sent to instance error: and Failed to call designated initializer on NSManagedObject class 【发布时间】:2013-08-30 10:23:59 【问题描述】:

我已尝试使用以下代码更新核心数据中的对象,但出现错误。

    NSError *error;
    NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    NSLog(@"objects %@",objects);


    // yourIdentifyingQualifier is unique. It just grabs the first object in the array.
    AllChallenge *tempChallenge = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0];


    tempChallenge =[[AllChallenge alloc] init];
    NSLog(@"tempchallenge >>>>> %@",tempChallenge);

    // update the object

    tempChallenge.status = 1;



    [self.managedObjectContext save:&error];

编译后我得到CoreData:错误:无法调用NSManagedObject类'AllChallenge'上的指定初始化程序。谢谢你的帮助。

【问题讨论】:

objAllChallenge 来自哪里?你的意思是写tempChallenge 是的,我的意思是 tempChallenge。 问题是您是否在代码中使用 tempChallenge 或 objAllChallenge。不在问题中。 【参考方案1】:

如果你想更新一个 现有的 对象,那么你不应该用一个新的来替换它 分配一个:

AllChallenge *tempChallenge = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0];
// tempChallenge =[[AllChallenge alloc] init]; // <-- REMOVE THIS LINE
tempChallenge.status = 1;
[self.managedObjectContext save:&error];

如果你想创建一个 new 对象那么你必须使用指定的初始化器, 或者这个方便的方法:

AllChallenge *tempChallenge = [NSEntityDescription insertNewObjectForEntityForName:@"AllChallenge" inManagedObjectContext: managedObjectContext];

【讨论】:

以上是关于发送到实例错误的核心数据无法识别的选择器:并且无法在 NSManagedObject 类上调用指定的初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:发送到实例的无法识别的选择器

更新核心数据模型后出错 - 无法识别的选择器发送到实例

无法识别的选择器 - 保存到核心数据

[标签比较:]:无法识别的选择器发送到实例

当核心数据中找不到相关实体时,无法识别的选择器发送到实例

核心数据-[Decodable.Address initWithCoder:]:发送到实例的无法识别的选择器