核心数据:我想在我的获取对象中使用pk

时间:2009-07-28 14:06:35

标签: iphone database xcode core-data primary-key

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

但是我无法使它工作,我只需要一个唯一的文件名来存储我的图像。 有人有解决方案吗?

当我的NSLog对象ID我得到这个:

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

输出: ID:0x124dd00

我知道最后一个p11,类似于PK,但最好的方法是什么?

4 个答案:

答案 0 :(得分:10)

我们可以生成一个唯一的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。

答案 1 :(得分:2)

抱歉迟到的回复:)

你可以这样做(假设其他人已经说过,对象ID已经是你对象的永久物):

[[[myManagedObject objectID] URIRepresentation] lastPathComponent]

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

希望这有帮助, 肯

答案 2 :(得分:0)

您无法直接访问SQL PK,因为这是CD使用的内部细节,可以使对象独特并可能发生变化。您可以使用NSManagedObjectID

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

  return objectURL;
}

然后,您可以将该URL用作文件名。您可能希望删除模式和其他一些位,但如果您对URL进行编码,使其只包含文件名中合法的字符,则不需要这样做。只需确保在执行此操作时该对象已被保存,或者该ID不是永久ID(有关详细信息,请查看NSManagedObjectID的文档)。

答案 3 :(得分:0)

好的,谢谢,现在我知道我正朝着正确的方向前进!当我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