2013-02-11 67 views
0

我正在尝试为coreData中的对象创建指纹,并且想要将其设置为属性到对象。我想CFBitArray是要走的路。CFBitVector作为属性存储到coredata对象

我试图找出如何拯救这个每个对象:

下面是一个例子

对象

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

这是用来尝试匹配主打印

任何su ggestions?

+0

可能重复[如何存储CFBitVector(或任何CFType)的核心数据使用CFData/NSData的?](http://stackoverflow.com/questions/11384790/how-to-store-cfbitvector-or-any-cftype-in​​-core-data-using-cfdata-nsdata) – Stuart 2013-04-07 08:09:38

回答

1

您必须将其转换为核心数据理解的内容并保存转换后的值。有几种可能性,其中包括通过CFBitVectorGetBits获取实际位。一旦你有,你可以

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

您可以通过使用自定义的访问方法您NSManagedObject子类,或者使用变形核心数据进行转换属性类型和值转换器类。对于后者,您需要子类NSValueTransformer并在那里实现您的转换(Apple提供了几个这样的示例)。

根据你实际在做什么,你可能要考虑使用NSIndexSet而不是CFBitVectorRef。如果没有其他,它符合NSCoding - 这意味着你可以使用可变形的属性,但依靠核心数据的默认值转换器,而不是写自己的。

您也许会发现仅使用其中一种整数类型并依赖按位运算符来确定是否设置了一个位就简单多了。那么你不需要对核心数据做任何特殊的处理,你只需选择适当大小的整数类型即可。

+0

声音可行。生病了拿你的nsindexset建议,但我认为这对于int来说太长了(指纹是1500 1和0的组合),这应该尽量减少核心数据的工作。 – 2013-02-11 22:59:10

+0

是的,对于数字类型,1500位是很多。 :) – 2013-02-11 23:06:12

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]); 
+0

你能举个例子吗? – 2013-02-12 21:30:11