2011-03-22 144 views
5

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

理想情况下,它将被存储为二进制数据(128位),但是这样做是否有任何直接的问题?按照这种方式存储它会更有效,而不是NSString,但我只想检查将此存储为二进制数据时没有性能问题。它仍然会被正确编入二进制数据?在可变宽度字段中存储什么是有效固定宽度的二进制数据有什么缺点?

我不太熟悉SQLite及其存储/索引机制,因此希望能够提供一些建议!

+0

使用内置GUID类型的问题究竟是什么?显然,你不想将UUID作为字符串存储,但是为此需要一个特定的DB类型。 – 2011-03-22 14:43:20

+0

核心数据中没有GUID属性类型。如果通过GUID表示由Core Data创建的托管对象ID,则这不是一种选择,因为这些ID需要在多个不同系统间保持持久性和唯一性。 – 2011-03-22 15:11:38

回答

3

您打算存储多少个这样的计划?将它们存储为二进制数据可节省大约50% - 大约20个字节作为二进制数据,而大约40个字节作为一个字符串。所以你说的是每千次UUID节省20K,这并不是我担心这种情况。然而,如果你真的想把它们保存为二进制数据,你可以通过将它们存储为NSData对象来实现。

+0

您是否知道“二进制数据”字段是否可以正确索引? – 2011-03-22 15:33:50

+0

您是否在模型中为该属性设置了“索引”标志? – Caleb 2011-03-22 15:42:07

+0

是的,这是勾选。我只是想知道关于存储和索引小块的任何内部问题或者我应该知道的事情。 – 2011-03-22 15:56:24

0

我将我的UUID存储为“Transformable”,它运行良好。在你的核心数据模型(.xcdatamodel文件)与名uuid与类型 @NSManaged var uuid: NSUUID!

  • ,创建属性Transformable

  • 查询作品:

    1. 添加到您的NSManagedObject子我也写我的谓词来搜索它们,如下所示:

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

    6

    从iOS 11开始,您可以直接在核心数据编辑器中设置UUID属性。 UUID将自动保存为二进制文件。

    enter image description here

    您可以接着使用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 
    } 
    
    +0

    我是否必须设置'identifier'值,还是自动为我创建? – matt 2017-11-09 02:40:12

    +0

    @matt你需要手动设置'identifier'。 – Jonny 2017-11-09 04:19:34

    +0

    我同意,它似乎开始生活为零。这看起来很愚蠢,因为很明显uuid应该是什么意思,但我已经有了设置uuid的代码,所以没有额外的工作。谢谢! – matt 2017-11-09 04:28:37