0

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

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

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

请注意,委托是对我之前声明的应用委托的引用。也许这不是明智的做法。

设置所有属性后,我有:

    [[delegate managedObjectContext] save:&error];

这一行崩溃了,回溯说它在里面[NSSqlLiteConnection execute],在 save 函数里面大约有 8 个级别。例外是:

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

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

4

1 回答 1

2

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

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

于 2010-08-25T20:39:05.813 回答