Core data 核心数据轻量迁移失败-“;表ZTABLENAME已存在“;

Core data 核心数据轻量迁移失败-“;表ZTABLENAME已存在“;,core-data,data-migration,Core Data,Data Migration,注意!我看到了,但这并没有解决我的问题 我正在尝试对我的数据模型进行轻量级迁移,但在这一点上失败了: NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSN

注意!我看到了,但这并没有解决我的问题

我正在尝试对我的数据模型进行轻量级迁移,但在这一点上失败了:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                         nil];
store = [self addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
                    URL:url options:options error:&error];
错误消息是:

2012-09-06 17:14:19.450 Selene[79064:c07] CoreData: error: (1) I/O error for database at /Users/colin/Library/Application Support/iPhone Simulator/5.1/Applications/E1638F38-B13A-4728-91CD-CC380E761544/Library/Application Support/Selene/.Selene.sqlite.migrationdestination_41b5a6b5c6e848c462a8480cd24caef3.  SQLite error code:1, 'table ZMEASUREMENT already exists'
数据模型的实际变化是在一个完全不同的表ZCYCLE上添加了一个可选的字符串列。因此,它抱怨ZMEASUREMENT毫无意义

我已经完成了核心数据实例化,NSManagedObjectModel看起来加载正确(新版本)。url是正确的

我已经尝试在xcode中进行清理,重置内容和设置。。。在iOS模拟器中,从头开始重新生成一个版本1的sqlite文件(使用核心数据),然后再次尝试迁移到版本2——不需要掷骰子。所以我的sqlite文件并不是因为某种原因而损坏的

数据模型信息是否存储在我清理时可能遗漏的其他地方

有没有其他方法来调试轻量级迁移中实际发生的事情?除了上面引用的“表已经存在”错误之外,我找不到任何信息,这对我来说没有任何意义。addPersistentStoreWithType:中发生的任何事情对我来说都是不透明的

我发现让迁移继续进行的唯一方法是在迁移过程中重命名核心数据所抱怨的表ZMEASUREMENT。这只适用于一(1)次迁移,然后我必须再次重命名该表以进行第二次迁移。我真的不同意这样一种想法:每次我改变数据模型时,表的名称都必须改变;当然,核心数据并没有这么坏

编辑: 如果有帮助,下面是表ZMEASUREMENT的属性列表。这有什么奇怪的吗

@property (nonatomic) int epochDay;         // Integer32 indexed
// time as number of seconds since local midnight, to avoid time zone and DST issues
@property (nonatomic, strong) NSNumber *localTime;  // Integer32 optional

// stored in Kelvins, to force me to test temperature conversion code properly
@property (nonatomic, strong) NSNumber *temperatureK;   // Float optional
@property (nonatomic) BOOL excludeTemperature;      // Boolean default=NO
@property (nonatomic, strong) NSNumber *fluidCode;  // Integer16 optional
@property (nonatomic, strong) NSNumber *openingCode;    // Integer16 optional
@property (nonatomic, strong) NSNumber *positionCode;   // Integer16 optional
@property (nonatomic, strong) NSNumber *textureCode;    // Integer16 optional
@property (nonatomic, strong) NSNumber *rateCode;   // Integer16 optional
@property (nonatomic, strong) NSNumber *heightCode; // Integer16 optional
// try renaming the internal property to see if it helps lightweight migration
@property (nonatomic, strong) NSString *commentDPL; // String optional
@property (nonatomic, strong) NSString *comment;    /* derived property (alias for commentDPL) */
@property (nonatomic, strong) NSSet *notes;     // Optional to-many relationship to MeasurementNote

唯一的非可选字段是epochDay和excludeTemperature。

首先,您是否尝试过检查数据库的完整性?很多时候,当我迁移客户机时,它会抛出错误,因为他们的数据库实际上已损坏,但损坏程度很轻,直到迁移时才发现

您可能希望执行以下操作:

sqlite3 FILENAME
pragma integrity_check;

您是否使用名称与内置方法名称一致的属性或实体?没有这些名称的列表,但是像“name”、“count”这样的名称可能会因为这种影响而引起问题


还有,新属性是第十七个吗?

好的,最终要解决我的问题,我必须删除整个xcdatamodeld目录,从头开始重新生成数据模型。我想我在那里不知怎的腐败了?它现在似乎起作用了;祝你好运。我对这个解决方案不满意,因为这会让我要求所有的测试人员扔掉他们保存的数据,然后重新开始,但这似乎是我唯一的选择


如果有人对到底出了什么问题有更好的想法,我还是很想听听。我的应用程序将依靠保存的数据的可靠性而生存和消亡,如果我还有付费客户的话,这种“解决方案”将彻底摧毁一切并重新开始将是不可能的。核心数据现在让我很紧张。

“pragma integrity\u check;”返回“ok”。我还尝试删除并重新生成sqlite文件。不过,我对sqlite不太熟悉——不确定是否还有其他方法可以尝试。(即在dev中删除并重新生成。)新属性是表ZCYCLE中的第四个属性,因此我认为没有乐趣。sqlite表中的属性有限制吗?我在ZMEASUREMENT中看到的最合理的方法名称是“comment”;我尝试过改变它,但没有起到任何作用。为了澄清(因为有人问),我现在没有计划进行多个迁移,但我有一个很长的功能列表,并且有点希望在一段时间内为数据模型添加位。所以我希望能够进行迁移,因为这没什么大不了的——当然,我从《核心数据模型版本控制和数据迁移编程指南》中得到的印象是,迁移应该是简单明了的,对吧?