代码之家  ›  专栏  ›  技术社区  ›  steipete

通过迁移将核心数据索引添加到某些属性

  •  24
  • steipete  · 技术社区  · 15 年前

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

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

    是否有手动添加索引的方法?为此编写一些SQL?还是我错过了什么?我已经做了一些更重要的迁移,没有问题。但是那些缺失的索引让我心烦意乱。

    谢谢你的帮助!

    2 回复  |  直到 10 年前
        1
  •  50
  •   Douglas Hill    10 年前

    我也有同样的问题。

    根据 Core Data Model Versioning and Data Migration Programming Guide :

    核心数据对版本控制的看法 它只对 影响模型的特征 坚持不懈。

    只向现有模型属性添加索引不会自动触发迁移,因为核心数据不会将两个模型模式视为不同的模式(索引不会影响持久性)。

    但是,通过向新索引的属性添加版本哈希修饰符,您可以使核心数据将模型视为已更改。这触发了轻型迁移以更新现有数据库。

        2
  •  0
  •   ohhorob    15 年前

    您使用了什么迁移策略?

    在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);
    

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