CoreData 的自定义 UID 数据类型

Posted

技术标签:

【中文标题】CoreData 的自定义 UID 数据类型【英文标题】:Custom UID data type for CoreData 【发布时间】:2009-08-28 22:04:09 【问题描述】:

CoreData 文档说“您有时可以从创建自己的唯一 ID (UUID) 属性中受益,该属性可以为新插入的对象定义和设置。这允许您使用谓词有效地定位特定对象(尽管在保存操作之前 new对象只能在其原始上下文中找到)。”

这种类型应该使用什么?

托管对象的 objectID 通常是“NSManagedObjectID”类型,但通过 XCode 的 DataModel 向导工具允许您为给定属性设置类型,除了“未定义”、二进制数据和可转换之外,它仅具有基本允许的类型。

如果我想要一个属性作为对象的辅助 id(除了它的标准 ObjectID),您是将其存储为 NSString 还是自定义修改对象模型以保存 NSManagedObjectID?

(用于 iPhone 应用/CoreData 开发)

【问题讨论】:

【参考方案1】:

NSString 或整数属性是合乎逻辑的选择,尽管您可以使用可转换的属性来存储您想要的任何内容(当然,可以适当地序列化)。递增整数可能足以满足多种用途,但每个用例都不同。网络上存在许多用于生成字符串或字节数组 UUID 的算法(从 Google 开始)。 NSString UUID 非常简单:

+(NSString*)UUIDString 
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [NSMakeCollectable(string) autorelease];

对于字节数组,请查看CFUUIDGetUUIDBytes()

在你走这条路之前,请仔细考虑是否有必要。从 SQL 的角度来看,人们“想要”他们的 id,但 Core Data 与关系数据库无关。它是一个对象图管理框架,恰好使用 SQLite 作为一个支持实现。如果你试图在 Core Data 中做类似 SQL 的事情,你将与框架作斗争。在正确使用 Core Data 框架时,通常需要一个单独的 id 属性。

【讨论】:

最后一行应该是 return [NSMakeCollectable(string) autorelease]; 以便在 GC 和保留/释放模式下进行正确的内存管理。

以上是关于CoreData 的自定义 UID 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 中将自定义类保存为 CoreData 实体的属性?

Swift 和 CoreData 与自定义类作为可转换对象

CoreData 类的自定义方法

插入时不调用 Core Data 的自定义验证方法

用于自定义 Rest API 的最佳身份验证类型?

iOS中的自定义排序,希望在Coredata的顶部显示默认(所有组)标题