CoreData iOS - 如何为对象创建唯一ID?

时间:2015-11-03 17:00:06

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

我在IOS上有一个用于iPhone和iPad等的项目。对于项目,我使用CoreData来保存用户在应用程序中提供的数据。为了便于理解,可以说它就像一个联系人应用程序。所以基本上你知道你有你的名字,工作,电话等。这个应用程序也存储每个"联系人"的图像。当然可选。为了防止数据库效率低下,我使用下面的路径代码将图像存储到DocumentsDirectory中。通过使用ManagedObjects id调用图像,该ID也是图像名称中使用的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(An int-32)。而不是这样做,我想知道是否有一种方法CoreData创建或可以为存储的每个对象创建唯一ID。这样,如果我更改了ID,它就会失去它的图片,或者如果另一个对象具有相同的ID,则它不会使用相同的图片。

像我以前使用的MySQL这样的一些数据库有一个属性选项,可以为用户/论坛/帖子等提供一个唯一的ID ...在XCode的CoreData中有类似的东西吗?我不想在每个对象上解析得到一个尚未使用的数字。

3 个答案:

答案 0 :(得分:5)

  

像我以前使用的MySQL一些数据库......

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

托管对象具有唯一的ID字段,您可以使用类型为objectID的{​​{1}}进行查找。它是一个不透明的类,但您可以使用其NSManagedObjectID方法将其转换为NSURL。从那里你可以将它转换为字符串并将其用于图像文件名。

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

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

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

URIRepresentation

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

我建议您创建自己的uniqueId属性,并使用CFUUID之类的内容填充它,更详细地说明here