26

出于性能原因,我想为我的一些实体设置索引属性。我创建了一个新的核心数据模型版本来执行更改。Core Data 检测到更改并将我的模型迁移到新版本,但是,NO INDEXES ARE GENERATED

如果我从头开始重新创建数据库,则索引就在那里。我在 iPhone 和模拟器上都使用 SQLite 浏览器进行了检查。仅当先前格式的数据库已经存在时,才会出现此问题。

有没有办法手动添加索引?为此写一些sql?还是我错过了什么?我已经做了一些更关键的迁移,那里没有问题。但是那些缺失的索引让我很烦。

感谢您的帮助!

4

2 回答 2

53

我有同样的问题。

根据核心数据模型版本控制和数据迁移编程指南

Core Data 对版本控制的看法是,它只对影响持久性的模型特性感兴趣。

简单地将索引添加到现有模型属性不会自动触发迁移,因为 Core Data 不会将您的两个模型模式视为不同(索引不会影响持久性)。

但是,您可以通过向新索引的属性添加版本哈希修饰符来使 Core Data 看到您的模型已更改。这触发了轻量级迁移以更新我现有的数据库。

于 2010-07-05T21:44:06.047 回答
0

您使用了什么迁移策略?

在 XCode 中,您可以生成映射模型,并查看将发生的更改,包括索引。

我建议简单地添加映射模型,验证索引更改是否指定,然后进行自动轻量级迁移:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil];
NSPersistentStore *migratedStore = [persistentStoreCoordinator addPersistentStoreWithType:nil configuration:nil URL:storeURL options:options error:&error];
migrationWasSuccessful = (migratedStore != nil);

持久存储协调器将自动发现映射模型,并使用它来执行迁移。听起来运行时推断模型对将索引应用于实体属性并不敏感。

于 2010-03-29T20:20:37.823 回答