2011-03-22 156 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