核心数据轻量级迁移失败 - “表ZTABLENAME已存在”

时间:2012-09-06 21:52:26

标签: core-data data-migration

NB!我见过Core Data Migration - Table Already Exists,并没有解决我的问题。

我正在尝试对我的数据模型进行轻量级迁移,并且此时出现故障:

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看起来正确加载(新版本)。网址是正确的。

我尝试在iOS模拟器中使用xcode,重置内容和设置...进行清理,从头开始重新生成版本1 sqlite文件(使用Core Data),然后尝试再次迁移到版本2 - 否骰子。所以这不是我的sqlite文件以某种方式损坏。

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

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

我发现进行迁移的唯一方法是重命名Core Data正在抱怨的表ZMEASUREMENT,作为迁移的一部分。这仅适用于一(1)次迁移,然后我必须再次重命名该表以执行第二次迁移。我真的不满意每次改变数据模型时都要改变名称的表的想法;当然,Core Data并没有被破坏。

编辑: 如果它有帮助,这里是表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。

3 个答案:

答案 0 :(得分:1)

首先,您是否尝试过检查数据库的完整性?很多时候,当我迁移客户端时,它会抛出错误,因为它们的数据库确实存在损坏,但是腐败程度足够温和,直到迁移才会发现。

你想做的事情如下:

sqlite3 FILENAME
pragma integrity_check;

答案 1 :(得分:1)

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

新的属性也是第17个,任何机会?

答案 2 :(得分:0)

好的,最终要解决我的问题,我必须删除整个xcdatamodeld目录并从头开始重新生成数据模型。我猜我在那里有腐败?它似乎现在起作用;手指交叉。我对此作为一种解决方案并不满意,因为它会让我要求所有的beta测试人员丢弃他们保存的数据并重新开始,但这似乎是我唯一得到的。

如果有人更清楚究竟出了什么问题,我仍然来听取它。我的应用程序将继续存在并且因为保存数据而变得可靠,如果我有任何付费用户,这种废弃一切并重新开始的“解决方案”将是一个非首发。核心数据现在让我感到紧张。