【问题标题】:Why creating index in CoreData will end up duplicated index (with different name) in SQLite file?为什么在 CoreData 中创建索引会导致 SQLite 文件中的索引重复(名称不同)?
【发布时间】:2021-09-19 20:38:07
【问题描述】:

我想知道你们中有人遇到过这种奇怪的情况吗?

我试图索引实体中的属性。

例如,对于名为NSPlainNote 的实体,我尝试在属性label 上创建一个名为index_plain_note_label 的索引。

这就是它的样子。

label 的属性看起来也很简单。

但是,如果我检查生成的 SQLite 文件的内容。

似乎创建了 2 个不同名称的相同索引。

CREATE INDEX Z_NSPlainNote_index_plain_note_label ON ZNSPLAINNOTE (ZLABEL COLLATE BINARY ASC)

CREATE INDEX Z_NSPlainNote_label ON ZNSPLAINNOTE (ZLABEL COLLATE BINARY ASC)

如果我们仔细观察,这种重复也会发生在所有其他具有 1 个属性的索引中

  1. NSPlainNote 的命令
  2. NSPlainNote 的置顶
  3. NSTabInfo 的订单

这种重复不会发生在具有 2 个属性的索引或具有唯一约束的索引上。

似乎是一个不受欢迎的结果。因为,拥有索引会降低写入速度。因此,理论上,重复索引会降低写入速度 x2。

我可以知道为什么会这样吗?有没有哪一步我做错了?

【问题讨论】:

  • 有趣 - 我尝试它时没有重复,但(奇怪的是)在进行迁移时,CD 确实尝试删除重复的索引。重复项的名称与过去用于先前索引解决方案的名称一致(NSAttributeDescription 现已弃用 isIndexed)。您的标签属性是否可能以前标记为isIndexed
  • @pbasdf 我猜不是。我用label 属性的屏幕截图更新了问题。我的项目是一个尚未公开的全新项目。之前没有进行过迁移。
  • @pbasdf 我想知道,你使用的是什么版本的 XCode?谢谢。
  • 在 iPhone 12 Pro Max 模拟器上使用运行 iOS 14.5 的 Xcode 版本 12.5.1 (12E507)。

标签: ios swift core-data


【解决方案1】:

你没有做错任何事。每次创建索引时,CoreData 都会执行以下操作 -

  1. 创建您定义的索引 - 在本例中为 index_plain_note_label
  2. 为该索引中使用的所有属性创建不同的索引(如果它们不存在) - 在本例中为 label 属性索引。

为什么需要这样做?

不确定。 CoreData 有自己的处理方式,我们不必担心它如何促进它的工作。


测试
  1. 尝试使用单个属性创建一个索引。
  2. 尝试使用 #1 中未包含的 2 个其他属性创建另一个索引。

你会看到它总共会创建 5 个索引

  1. 您定义的 2 个索引
  2. index #1 的 1 个属性索引 + index #2 的 2 个属性索引)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-24
    • 2015-11-06
    • 2019-01-23
    • 1970-01-01
    • 2018-02-21
    • 2014-08-27
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多