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

问题描述:

我想将核心数据添加到现有的应用程序,这是不容易的考虑到所有的文档和每个教程开始创建一个应用程序,使用核心数据开始。所以我试图将现有的模型类转换为核心数据实体。以下是我所做的:核心数据:NSManagedObjectContext保存与无法识别的选择器崩溃

  1. 添加核心数据框架。
  2. 添加一个xcdatamodel文件。它向我展示了一个可以添加现有类的对话框,因此我添加了模型。然后我调整了属性,并告诉它属于哪些类型。
  3. 而不是生成一个新的模型类(因为我已经有一个),我创建了一个测试项目,看看它会是什么样子,并调整我的类匹配。这包括将其更改为从NSManagedObject继承,改变我的属性,以动态,消除呼吁释放等
  4. 新增的核心数据对象到我的应用程序委托,下面this example.
  5. 在我的ViewController,我曾经的Alloc我模式,我把它改成

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

注意该委托是我的应用程序委托的引用,之前声明。也许这不是做这件事的明智之举。

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

[[delegate managedObjectContext] save:&error]; 

此行崩溃,并回溯说,这是里面[NSSqlLiteConnection execute],保存功能内约8个级别。例外情况是:

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

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

+0

这只是一个猜测,但是您可能更改了模型中某个属性或关系的名称,并且生成的对象仍使用旧名称?因此,它试图在仅具有“getMyOldAttribute”的类上执行“getMyNewAttribute”。 – samkass 2010-08-25 20:29:00

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

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

+0

宾果。当我创建实体时,它会从类中导入所有内容,包括CLLocationCoordinate2D。我在模型中摆脱了这一切,一切都奏效了。 – Tesserex 2010-08-25 22:24:28