注意!我看过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 看起来已正确加载(新版本)。网址是正确的。
我尝试在 xcode 中进行 Clean,在 iOS 模拟器中重置内容和设置...,从头开始重新生成版本 1 的 sqlite 文件(使用核心数据),然后再次尝试迁移到版本 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。