核心数据:NSManagedObjectContext使用无法识别的选择器保存崩溃

时间:2010-08-25 20:22:32

标签: iphone exception core-data unrecognized-selector

我正在尝试将Core Data添加到现有应用程序中,考虑到所有文档和每个教程都是从创建一个从一开始就使用核心数据的应用程序开始,这并不容易。所以我试图将现有的模型类转换为核心数据实体。这是我做的:

  1. 添加核心数据框架。
  2. 添加xcdatamodel文件。它向我展示了一个可以添加现有类的对话框,因此我添加了我的模型。然后我调整了属性并告诉它类型是什么。
  3. 我没有生成一个新的模型类(因为我已经有一个),而是创建了一个测试项目来查看它的外观,并调整我的类以匹配。这包括将其更改为从NSManagedObject继承,将我的属性更改为动态,删除释放调用等。
  4. this example.
  5. 之后,将核心数据对象添加到我的应用代理
  6. 在我用于分配模型的ViewController中,我将其更改为

    MyModel *model = (MyModel*)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel"] inManagedObjectContext:[delegate managedObjectContext];
    
  7. 请注意,delegate是对我之前声明的app委托的引用。也许这不是明智的做法。

    设置完所有属性后,我有:

        [[delegate managedObjectContext] save:&error];
    

    此行崩溃,并且回溯表示它位于[NSSqlLiteConnection execute]内,保存功能内约8个级别。例外是:

    *-[NSConcreteValue UTF8String]: unrecognized selector sent to instance*
    

    这具体价值是什么?为什么这被称为谁?如果重要,我的模型创建/保存代码在一个函数内,这是一个NSNotification的回调。这是在一个单独的线程?我听说managedObjectContext不是线程安全的。但是我没有得到同样的错误。

1 个答案:

答案 0 :(得分:2)

好吧,我很确定你的数据库模型(.xcdatamodel)上有一个声明为NSString的属性,它被声明为对象模型上的其他东西(可能是NSNumber)。编译代码时,不会生成任何警告,但是当CoreData尝试保存moc时(即:在持久性存储上写入数据,AKA是您的SQLite数据库),当CoreData尝试将您假设的NSString转换为UTF8编码时,它会失败。

您应该仔细检查数据库模型和对象模型上的属性。