【问题标题】:CoreData: error: Failed to call designated initializer on NSManagedObject classCoreData:错误:无法在 NSManagedObject 类上调用指定的初始化程序
【发布时间】:2013-01-18 06:02:26
【问题描述】:

我对 CoreData 有一点该死的问题。我想插入一个新对象,所以我首先要创建一个。这是由该代码完成的:

Challenges *newChallenge = [[Challenges alloc] init];
[newChallenge setName:@"TestChallenge"];
[newChallenge setRounds:[[NSNumber alloc] initWithInt:12]];
[newChallenge setShots:[[NSNumber alloc] initWithInt:5]];
[newChallenge setDate:[NSDate date]];

但是在 alloc init 之后我得到了这个错误:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'Challenges'

黑客出了什么问题?

【问题讨论】:

    标签: objective-c core-data initializer


    【解决方案1】:

    我认为问题在于 Challenges 是一个 NSManagedObject 类,您需要指定的初始化程序:

    initWithEntity:insertIntoManagedObjectContext:
    

    而不是

    Challenges *newChallenge = [[Challenges alloc] init];
    

    Read More..

    【讨论】:

    • 我想你的意思是指定初始化器。
    • @jiehr:当然我的意思是指定的初始化器——非常感谢! (我已经编辑了答案)
    【解决方案2】:

    如果您问自己“好的,那么我如何获得该实体?” (就像我做的那样),你可以像这样使用 entityForName 方法:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Challenges" inManagedObjectContext:self.managedObjectContext];
    
    Challenges *newChallenge = [[Challenge alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];
    

    希望这有帮助,这个帖子对我有很大帮助!

    【讨论】:

      【解决方案3】:

      NSManagedObject 不能只是 alloc/init,就像您通常对 NSObject 所做的那样。事实上,指定的初始化程序是: initWithEntity:insertIntoManagedObjectContext:

      现在,对于实际错误,Apple states in the documentation 表示:

      重要:这个方法是指定的初始化器 NSManagedObject。您不能简单地通过以下方式初始化托管对象 发送它初始化。

      所以,你可以看到你需要两件事来初始化它,一个NSEntityDescription(你打算实例化的实体)和一个NSManagedObjectContext(新对象将被创建到的上下文)。

      【讨论】:

        【解决方案4】:

        其他人已经说明了为什么它不起作用。以下是减少样板文件并使代码更具可读性的方法:

        @implementation NSManagedObject(MyPrivateAdditions)
        
        + (id)insertNewObjectInContext:(NSManagedObjectContext *)context
        {
            return [NSEntityDescription insertNewObjectForEntityForName:self.className inManagedObjectContext:context];
        }
        
        @end
        

        现在你可以这样做了:

        Challenges *newChallenge = [Challenge insertNewObjectInContext:context];
        

        【讨论】:

          【解决方案5】:

          另外,如果你的 Challenges 类是 NSManagedObject 并且 date、rounds 和 shot 被定义为它的属性,你可以添加方法:

          -(void) awakeFromInsert {
               self.date = [NSDate date];
               self.rounds = @(12);
               self.shots = @(5);
          }
          

          每个新对象从一出生就定义了这些属性。

          【讨论】:

            猜你喜欢
            • 2014-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-26
            • 1970-01-01
            相关资源
            最近更新 更多