【问题标题】:CoreData iOS - How to create unique ID for objects?CoreData iOS - 如何为对象创建唯一 ID?
【发布时间】:2016-02-03 22:47:18
【问题描述】:

我在 IOS 中有一个适用于 iPhone 和 iPad 等的项目。对于这个项目,我使用 CoreData 来保存用户在应用程序中提供的数据。为了便于理解,让我们说它就像一个联系人应用程序。所以基本上你知道你有你的名字、工作、电话等。这个应用程序还为每个“联系人”存储一个图像。当然可选。为了防止数据库效率低下,我使用下面的路径代码将图像存储到 DocumentsDirectory 中。使用 ManagedObjects id 调用图像,这也是图像名称中使用的内容。但是,多个对象可以具有相同的 id,这会导致一些问题。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *savedImagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"Person%i.jpg",[[_detailItem id] intValue]]];

基本上,我使用人的 id 拍摄图像。但是,多个人可以有相同的 id(An int-32)。我没有这样做,而是想知道 CoreData 是否有一种方法可以为每个存储的对象创建或创建唯一 id。这样,如果我更改 id 它不会丢失它的图片,或者如果另一个对象具有相同的 id 它不会使用相同的图片。

一些数据库,比如我以前使用的 MySQL,有一个属性选项,可以为它提供一个唯一的 id,用于用户/论坛/帖子/等... XCode 的 CoreData 中是否有类似的东西?我不想必须解析每个对象才能得到一个尚未使用的数字。

【问题讨论】:

    标签: ios objective-c core-data auto-generate


    【解决方案1】:

    一些数据库,比如我以前使用的 MySQL...

    在使用 Core Data 时不要再考虑 MySQL。这样做只会导致问题。

    托管对象有一个唯一的 ID 字段,您可以使用 objectID 查找该字段,类型为 NSManagedObjectID。这是一个不透明的类,但您可以使用其URIRepresentation 方法将其转换为NSURL。从那里您可以将其转换为字符串并将其用作图像文件名。

    只要您只使用一台设备,这些 ID 就是唯一的。如果您曾经在设备之间同步数据,则一台设备上的 ID 将与另一台设备上的 ID 不匹配。该 ID 供 Core Data 内部使用,并且仅在同一个持久存储文件中保持一致。

    如果你真的想要一个整数,你必须自己维护它。将最新整数的值存储在用户默认值或持久存储文件的元数据中。当你创建一个新实例时,你会读取整数,递增它,将它用于新实例,然后保存新值。

    更简单的方法是使用 UUID 作为唯一 ID。通过执行以下操作获取新的唯一 ID:

    NSString *newID = [[NSUUID UUID] UUIDString];
    

    将其存储为属性,并将其用作图像文件名的一部分。

    【讨论】:

      【解决方案2】:

      Core Data 无法自动执行此操作。您可以解析(永久)objectID 的字符串形式以获取 Core Data 的唯一标识符。更好的选择是将您的 id 更改为字符串并使用 UUID。

      【讨论】:

      • 当已经有一个答案高于零时,为什么要降低其他答案,尤其是当其他答案基本相同时?所有的答案都是在同一时间给出的,所以我们甚至没有互相重复。这对我来说似乎很琐碎。 (顺便说一句,我给汤姆的回答投了第一个赞成票,因为我在发布我的答案后看到了它,而且更好。这仍然没有理由惩罚我和马修。)
      【解决方案3】:

      我建议创建您自己的 uniqueId 属性,并用类似 CFUUID 的内容填充它,更详细地描述 here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        相关资源
        最近更新 更多