BitVector作为属性存储到核心数据对象

时间:2013-02-11 18:09:53

标签: core-data nsmanagedobject cfbitvector

我正在尝试为coreData中的对象创建指纹,并希望将其设置为对象的属性。我认为CFBitArray是要走的路。

我想弄清楚如何保存每个对象:

这是一个例子

对象

属性: 名称: 指纹(“01010101010101010101010110”)等......

这用于尝试与主打印

匹配

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您必须将其转换为Core Data所理解的内容,并保存转换后的值。有两种可能性,这两种可能性都涉及通过CFBitVectorGetBits获取实际位。一旦你有了,你可以

  • 使用NSData之类的内容将它们保存在+dataWithBytes:length:中,并将其放在托管对象的二进制类型属性中。或...
  • 根据您使用的字节数,使用类似NSNumber的内容(或任何足够长的位数)将它们保存在+numberWithLong:中。然后将其放入Core Data的一个整数类型中 - 再次选择适合您位的任何大小。

您可以使用NSManagedObject子类上的自定义访问器方法,或使用可转换 Core Data属性类型和值转换器类进行转换。对于后者,你需要继承NSValueTransformer并在那里实现转换(Apple提供了几个例子)。

根据您实际执行的操作,您可能需要考虑使用NSIndexSet而不是CFBitVectorRef。如果没有别的,它符合NSCoding - 这意味着您可以使用可转换的属性,但依赖于Core Data的默认值转换器而不是自己编写。

您可能还会发现使用其中一种整数类型并依赖于按位运算符来确定是否设置了位更加简单。然后,您不需要对Core Data执行任何特殊操作,只需选择适当大小的整数类型。

答案 1 :(得分:0)

为什么不只是存储NSData?在NSData内部存储二进制数据比在CFBitvectorRef内部更容易存储方式。

如果您尝试存储某些内容的哈希 / 指纹,我假设您正在创建 SHA-256 哈希CC_SHA256_Init_Update_Final。这些将为您提供所谓的摘要,这是您传递到CC_SHA256_Update的数据的指纹。

// Create the context:
CC_SHA256_CTX shaContext;
CC_SHA256_Init(&shaContext);
// For each value:
CC_SHA256_Update(&shaContext, &v, sizeof(v));
// Get the fingerprint / digest:
unsigned char digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256_Final(digest, &shaContext);
NSData *fingerprint = [NSData dataWithBytes:digest length:sizeof(digest)];

然后,您可以将指纹存储到二进制数据的核心数据属性中。

根据v的类型,您可能需要将呼叫更改为CC_SHA256_Update()。如果你在NSObject上执行此操作,则需要为您感兴趣的每个实例变量(应该是指纹的一部分)调用它,例如,如果你有

@property (nonatomic) int32_t count;
@property (nonatomic, copy) NSString *name;
你会做的

int32_t v = self.count
CC_SHA256_Update(&shaContext, &v, sizeof(v));

NSData *d = [self.name dataUsingEncoding:NSUTF8Stringencoding];
CC_SHA256_Update(&shaContext, [data bytes], [data length]);