1

注意!我看过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。

4

3 回答 3

1

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

你想做这样的事情:

sqlite3 FILENAME
pragma integrity_check;
于 2012-09-06T22:18:22.077 回答
1

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

还是新属性第十七,莫非?

于 2012-09-06T22:37:28.097 回答
0

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

如果有人对到底出了什么问题有更好的了解,我仍然很想听听。我的应用程序将因保存数据的可靠性而生死攸关,如果我还有任何付费客户,这种丢弃所有内容并重新开始的“解决方案”将是行不通的。Core Data 现在让我很紧张。

于 2012-09-07T19:53:04.130 回答