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。
答案 0 :(得分:1)
首先,您是否尝试过检查数据库的完整性?很多时候,当我迁移客户端时,它会抛出错误,因为它们的数据库确实存在损坏,但是腐败程度足够温和,直到迁移才会发现。
你想做的事情如下:
sqlite3 FILENAME
pragma integrity_check;
答案 1 :(得分:1)
您使用的是名称与内置方法名称一致的任何属性或实体吗?没有这些列表,但是像“name”,“count”这样的名称可能会因为这种效果而引起问题。
新的属性也是第17个,任何机会?
答案 2 :(得分:0)
好的,最终要解决我的问题,我必须删除整个xcdatamodeld目录并从头开始重新生成数据模型。我猜我在那里有腐败?它似乎现在起作用;手指交叉。我对此作为一种解决方案并不满意,因为它会让我要求所有的beta测试人员丢弃他们保存的数据并重新开始,但这似乎是我唯一得到的。
如果有人更清楚究竟出了什么问题,我仍然爱来听取它。我的应用程序将继续存在并且因为保存数据而变得可靠,如果我有任何付费用户,这种废弃一切并重新开始的“解决方案”将是一个非首发。核心数据现在让我感到紧张。