核心数据:我想要获取的对象中的 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的主要内容,如果未能解决你的问题,请参考以下文章