在Core Data中存储UUIDs

13

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

理想情况下,它将以二进制数据(128 位)的形式存储,但这样做是否存在问题?与将其存储为 NSString 相比,以这种方式存储将更加高效,但我只是想确认以二进制数据形式存储是否存在性能问题。它是否仍将被正确地作为二进制数据进行索引?在可变宽度字段中存储有效地固定宽度二进制数据是否存在任何缺点?

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


使用内置的GUID类型有什么问题?显然,您不希望将UUID存储为字符串,但是有一个特定的DB类型可以解决这个问题。 - Brandon Moretz
在Core Data中没有GUID属性类型。如果你指的是Core Data创建的托管对象ID,那么这不是一个选项,因为这些ID需要在多个不同的系统中持久且唯一。 - Michael Waterfall
3个回答

24

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

enter image description here

然后,您可以使用UUID(在Obj-C中为NSUUID)获取您的Core Data对象。

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
}

1
我需要设置“标识符”值吗,还是它会自动生成? - matt
我同意,它似乎从nil开始生活。这似乎很愚蠢,因为拥有uuid的含义是显而易见的,但我已经有了设置uuid的代码,所以这并不需要额外的工作。谢谢! - matt
2
@matt 你可以在 NSManagedObject.awakeFromInsert() 中设置 primitiveIdentifier = UUID(),这样你的 Core Data 对象就会始终具有默认标识符(非 nil)。 - Jonny
@matt,你需要声明@NSManaged var identifier: UUID@NSManaged private var primitiveIdentifier: UUID - Jonny

6
你计划存储多少个?将它们存储为二进制数据可以节省约50%--大约20字节的二进制数据与大约40字节的字符串相比。因此,每千个UUID可节省整整20K,这并不是我会担心的问题。但是,如果你真的想将它们保存为二进制数据,可以通过将它们存储为NSData对象来实现。

你知道“二进制数据”字段是否可以正确地建立索引吗? - Michael Waterfall
你在模型中设置了那个属性的“Indexed”标志吗? - Caleb
是的,这个已经勾选了。我只是想知道在存储和索引小的二进制大对象时是否存在任何内部问题或需要注意的事项。 - Michael Waterfall
2
我通常将它们保存为NSString。这使得查看和编写查询非常简单。我从未遇到过任何磁盘大小的问题。 - bentford

0

我将我的 UUID 存储为“可转换”并且它工作得很好。

  1. 将以下代码添加到您的 NSManagedObject 子类中:@NSManaged var uuid: NSUUID!

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接