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

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

    MyModel *model = (MyModel*)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel"] inManagedObjectContext:[delegate managedObjectContext];
    

请注意,委托是对我的应用程序委托的引用,先前已声明。也许那不是明智的方法。

设置所有属性后,我有:

    [[delegate managedObjectContext] save:&error];

这条线崩溃了,回溯说它在里面 [NSSqlLiteConnection execute], ,保存功能内约8个级别。例外是:

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

这种具体价值是多少?为什么这是由谁来称呼的?如果重要的话,我的模型创建 /保存代码就在一个函数内,该函数是NSNOTIFIECT的回调。那是在单独的线程上吗?我听说ManagedObjectContext不是线程安全的。但是在这种情况下,我没有得到我期望的同样的错误。

有帮助吗?

解决方案

好吧,我很确定您在数据库模型(.xcdatamodel)上宣布为NSString,该属性被声明为对象模型上的其他内容(也许是NSNUMBER)。编译代码时,没有生成警告,但是当Coredata试图保存MOC(即:在持久商店(aka aka your sqlite数据库)上编写数据时,当Coredata试图将所谓的NSString转换为utf8 Encoding时,它会失败。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top