核心数据:我想要获取的对象中的 pk

Posted

技术标签:

【中文标题】核心数据:我想要获取的对象中的 pk【英文标题】:Core data: I want the pk in my fetched objects 【发布时间】:2009-07-28 14:06:35 【问题描述】:

我想在我获取的对象中包含 pk,所以我可以使用唯一的 pk 编号作为唯一的图像文件名。

但我无法让它工作,我只需要为我的图像设置一个唯一的文件名。 有人对此有解决方案吗?

当我得到 NSLog 对象 ID 时:

NSManagedObjectID *ID = [someThing objectID]; NSLog(@"ID: %@",ID);

输出: ID:0x124dd00

我知道最后一个 p11,类似于 pk,但是到达它的最佳方法是什么??

【问题讨论】:

【参考方案1】:

我们可以生成一个唯一的 UUID 并将其存储为属性,而不是使用在对象生命周期中不是常量的 objectID。 UUID 可以按如下方式生成:

在托管对象的子类中,将以下代码添加到 awakeFromInsert:

- (void)awakeFromInsert;

    [super awakeFromInsert];
    CFUUIDRef UUID = CFUUIDCreate(kCFAllocatorDefault);
    CFStringRef UUIDString = CFUUIDCreateString(kCFAllocatorDefault,UUID);
    [self setValue:(NSString *)UUIDString forKey:@"uuid"];
    [UUID autorelease];
    [UUIDString autorelease];

这假定您存储 UUID 的属性称为 uuid。

【讨论】:

ios7 OSX10.8 及更高版本中,您可以使用 NSUUID 代替旧的 CFUUIDRef 类型。 developer.apple.com/library/mac/documentation/Foundation/…>【参考方案2】:

抱歉回复晚了:)

您可以这样做(假设正如其他人所说,objectIDs 对于您的对象已经是永久的):

[[[myManagedObject objectID] URIRepresentation] lastPathComponent]

...获取“p28”部分等。

希望这会有所帮助, 肯

【讨论】:

【参考方案3】:

您无法直接访问 SQL PK,因为这是 CD 用于唯一对象的内部详细信息,并且可能会更改。不过你可以使用NSManagedObjectID:

- (NSURL *) uniqueURLForManagedObject:(NSManagedObject *)managedObject 
  NSManagedObjectID *objectID = managedObject.objectID;
  NSURL *objectURL = managedObject.URIRepresentation

  return objectURL;

然后您可以将该 URL 用作文件名。您可能想要删除架构和其他一些位,但如果您以这样一种方式对 URL 进行编码,即它只有在文件名中合法的字符,则这不是必需的。只需确保在执行此操作时对象已被保存,否则 ID 将不是永久 ID(请查看 NSManagedObjectID 的文档了解更多详细信息)。

【讨论】:

请注意,一旦对象被保存到持久存储中,objectID 就会改变!因此,您只能在对象保存后写入图像。 如果您阅读答案,您会看到它的最后一句是“只需确保在执行此操作时对象已被保存,否则 ID 将不是永久 ID(查看 NSManagedObjectID 的有关详细信息的文档)。” 在 10.5 及更高版本中,您可以获得未保存对象的永久 ID。 -[NSManagedObjectContext 获得PermanentIDsForObjects:error:]【参考方案4】:

好的,谢谢,现在我知道我正在寻找正确的方向!当我 NSLog 我的所有对象时,它们看起来都一样,除了最后一点。

ID1: x-coredata://5B58789C-70CE-40D7-B0BA-B9F56DEBFF61/Things/p28
ID1: x-coredata://5B58789C-70CE-40D7-B0BA-B9F56DEBFF61/Things/p27
ID1: x-coredata://5B58789C-70CE-40D7-B0BA-B9F56DEBFF61/Things/p26
ID1: x-coredata://5B58789C-70CE-40D7-B0BA-B9F56DEBFF61/Things/p25

我不能跳过第一部分而只使用最后一位作为我的文件名吗?所以我的文件是这样命名的:

p25 p26 p27 p28

【讨论】:

以上是关于核心数据:我想要获取的对象中的 pk的主要内容,如果未能解决你的问题,请参考以下文章

获取对象是不是也获取核心数据中的关系对象

核心数据方便获取方法

获取核心数据中的对象id

获取核心数据对象,其中一对多关系包含集合中的所有对象

Restkit:从核心数据获取到服务器的 POST 对象数组

NSSortDescriptor 对核心数据获取请求没有影响