在核心数据中存储 UUID

Posted

技术标签:

【中文标题】在核心数据中存储 UUID【英文标题】:Storing UUIDs in Core Data 【发布时间】:2011-03-22 14:07:35 【问题描述】:

在 Core Data 中存储 UUID(用于全局多系统对象识别)的最佳方法是什么?考虑到存储大小和索引功能。

理想情况下,它将被存储为二进制数据(128 位),但是这样做有什么直接的问题吗?以这种方式存储它比将其存储为 NSString 更有效,但我只想检查将其存储为二进制数据是否存在性能问题。它是否仍会被正确索引为二进制数据?在可变宽度字段中存储有效的固定宽度二进制数据有什么缺点吗?

我对 SQLite 及其存储/索引机制并不太熟悉,所以想寻求一些建议!

【问题讨论】:

使用内置 GUID 类型到底有什么问题?显然你不想将 UUID 存储为字符串,但是有一个特定的数据库类型。 Core Data 中没有 GUID 属性类型。如果 GUID 是指由 Core Data 创建的托管对象 ID,则这不是一个选项,因为这些 ID 需要在多个不同的系统中保持不变且唯一。 【参考方案1】:

ios 11 开始,您可以直接在 Core Data 编辑器中设置 UUID 属性。 UUID 将自动存储为二进制。

然后您可以使用 UUID(在 Obj-C 中,NSUUID)获取您的核心数据对象。

static func fetch(with identifier: UUID) -> AudioRecord? 
    var record: AudioRecord?
    moc.performAndWait 
        let fetchRequest = AudioRecord.request
        fetchRequest.predicate = NSPredicate(format: "identifier == %@", identifier as CVarArg)
        fetchRequest.fetchLimit = 1
        record = (try? fetchRequest.execute())?.first
    
    return record

【讨论】:

我必须设置identifier 值,还是自动为我创建? 我同意,它似乎从零开始。这似乎很愚蠢,因为拥有 uuid 应该意味着什么很明显,但我已经有了设置 uuid 的代码,所以不需要额外的工作。谢谢! @matt 您可以在NSManagedObject.awakeFromInsert() 中设置primitiveIdentifier = UUID(),这样您的Core Data 对象将始终具有默认标识符(非零)。 @matt 你需要声明@NSManaged var identifier: UUID@NSManaged private var primitiveIdentifier: UUID【参考方案2】:

您打算存储其中的多少?将它们存储为二进制数据可以节省大约 50%——二进制数据大约 20 个字节,而字符串大约 40 个字节。所以你说的是每千个 UUID 节省 20K,这并不是我担心的任何一种方式。但是,如果您真的想将它们保存为二进制数据,可以通过将它们存储为 NSData 对象来实现。

【讨论】:

你知道“二进制数据”字段是否可以正确索引吗? 您是否在模型中为该属性设置了“索引”标志? 是的,打勾了。我只是想知道有关存储和索引小 blob 的任何内部问题或我应该知道的事情。 我通常将它们保存为 NSStrings。这使得查看和编写查询非常简单。我从来没有遇到过磁盘大小问题。【参考方案3】:

我将我的 UUID 存储为“可转换”,它运行良好。

    将此添加到您的 NSManagedObject 子类中: @NSManaged var uuid: NSUUID!

    在您的核心数据模型(.xcdatamodel 文件)中,创建一个名称为 uuid 的属性,类型为 Transformable

查询也很有效,我编写谓词来搜索它们,如下所示:

request.predicate = NSPredicate(format: "uuid == %@", withUuid)

【讨论】:

以上是关于在核心数据中存储 UUID的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 iPhone 上的核心数据获取性能?

如何在不知道 UUID、任何可能获得核心蓝牙或其他方式的情况下检测 iBeacons

核心数据:在一对多关系中按日期属性排序

在核心数据中存储图像

在 iPhone 上的核心数据中存储二进制数据

如何按日期过滤核心数据项?