Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS 5下的核心数据轻量级迁移和自反关系_Objective C_Cocoa Touch_Core Data - Fatal编程技术网

Objective c iOS 5下的核心数据轻量级迁移和自反关系

Objective c iOS 5下的核心数据轻量级迁移和自反关系,objective-c,cocoa-touch,core-data,Objective C,Cocoa Touch,Core Data,自从iOS5Betas以来,我一直在测试我的应用程序代码,而我的核心数据模型的轻量级迁移位一直在失败。我得到了“no-this column:FOK_reflective”错误,但奇怪的是,当没有旧版本出现时,我在设备和模拟器上第一次运行时就得到了这个错误。自从iOS4.x代码运行良好以来,我没有做任何改变 完全错误没有提供关于错误的额外信息,在我的头在桌子上敲击了一会儿之后,我可能已经将错误缩小到数据模型中的自反关系。Name通过名为Name的关系与Name建立多对多关系。(意思是罗布和鲍勃、

自从iOS5Betas以来,我一直在测试我的应用程序代码,而我的核心数据模型的轻量级迁移位一直在失败。我得到了“no-this column:FOK_reflective”错误,但奇怪的是,当没有旧版本出现时,我在设备和模拟器上第一次运行时就得到了这个错误。自从iOS4.x代码运行良好以来,我没有做任何改变

完全错误没有提供关于错误的额外信息,在我的头在桌子上敲击了一会儿之后,我可能已经将错误缩小到数据模型中的自反关系。Name通过名为Name的关系与Name建立多对多关系。(意思是罗布和鲍勃、罗伯特等有亲戚关系)。这会突然成为iOS 5的禁忌吗

此外,核心数据是否会在每个版本的数据模型中运行,并在每个版本中迁移,而不管应用程序应该使用哪个版本的数据模型?我认为第一次运行的应用程序出现迁移错误是很奇怪的

这里是唯一相关的代码,尽管我相信地球上的每个人都在使用Marcus Zarra的代码

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }

    NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Saline.sqlite"]];

    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil] error:&error])
    {
        NSLog(@"Schema changes...");
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return persistentStoreCoordinator_;
}
更新:完全错误如下

2011-10-20 08:14:17.700 Saline[28315:207] CoreData: error: (1) I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'
2011-10-20 08:14:17.731 Saline[28315:207] Schema changes...
2011-10-20 08:14:17.732 Saline[28315:207] Unresolved error Error Domain=NSCocoaErrorDomain Code=134110 "The operation couldn’t be completed. (Cocoa error 134110.)" UserInfo=0x6f7b2d0 {destinationURL=file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, reason=Cannot migrate store in-place: I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE', NSUnderlyingError=0x6f7cda0 "The operation couldn’t be completed. (Cocoa error 134110.)", sourceURL=file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/Saline.sqlite}, {
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"The operation couldn\U2019t be completed. (Cocoa error 134110.)\" UserInfo=0x6f75780 {NSSQLiteErrorDomain=1, NSFilePath=/Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3, reason=I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE', NSUnderlyingException=I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'}";
destinationURL = "file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3";
reason = "Cannot migrate store in-place: I/O error for database at /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/.Saline.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'no such column: FOK_REFLEXIVE'";
sourceURL = "file://localhost/Users/rob5408/Library/Application%20Support/iPhone%20Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents/Saline.sqlite";
}

你总是在发帖两秒钟后提出解决方案

我尝试将存储类型更改为二进制,认为其他存储类型可能没有“列”的概念,并且可能不易受到列问题的影响。这样做是可行的,但我更喜欢使用sqlite,因为它更容易调试(我知道,推理能力差)

因此,我仍然愿意找到一种解决方案,让自反关系在sqlite下工作。

核心数据迁移只允许从现有存储迁移到当前模型。它不会遍历每种型号。因此,您需要确保可以从存储中的任何内容迁移到当前模型

你真的给一个属性命名了吗?这可能是由核心数据以外的其他东西创建的sqlite存储吗

完全错误是什么

只有当存在要迁移的存储时,才会发生迁移。我会测试磁盘上是否有一个文件,当你得到一个错误,因为这将是唯一会启动迁移

更新 这实际上指向一个现有文件。由于您在模拟器中运行,如果您只是使用控制台查看会发生什么

ls -la /Users/rob5408/Library/Application Support/iPhone Simulator/5.0/Applications/865AD162-49BC-4809-A63A-23E6D5A5E5C4/Documents
你看到了什么?或者尝试:

find /Users/rob5408/Library/Application Support/iPhone Simulator | grep sqlite

另一个选项是打开SQL调试,让我们看看输出是什么。您可以通过将参数
-com.apple.CoreData.SQLDebug 3
添加到可执行文件并查看控制台输出来完成此操作。我很想看到结果。

首先,请注意二进制和sqlite的性能不同。二进制存储将完全加载到内存中,而sqlite将只加载您需要的内容。您将有一个不同的内存签名使用二进制。嗨,马库斯,荣幸!我在上面公布了全部错误。我肯定没有早期版本的文件。这甚至发生在一款新的苹果手机上。不过,这里有一件奇怪的事情,当我刚刚重新测试代码时,我最初也未能将我的数据存储文件重命名(从.salbin重新命名为.sqlite),结果成功了。我知道这会让“现有文件”理论更加可信,但我肯定不是这样。这可能是iOS对名为.SQLite的SQLite存储的处理吗?在阅读有关切换存储类型的文章时,我还读到您应该使用自定义文件扩展名。啊,我感觉不舒服。是你说的。很久以前,我包含了一个种子数据库,它在第一次运行时被移动(从应用程序包到文档)。即使在那里,我也完全忘记了。我成了“这不是我的代码,一定是SDK错误”谬论的受害者。只是找了个专家让我再看一遍错误信息。非常感谢。相关/重复:@tc。实际上,我的问题是,在加载应用程序时,我突然进入了另一家根据旧型号创建的商店,并替换了正确的商店。如果有人像我一样愚蠢,我会感到惊讶。