在核心数据中存储 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的主要内容,如果未能解决你的问题,请参考以下文章