2013-02-11 3 views
0

Я пытаюсь создать отпечаток для объекта в coreData и хочу установить его как атрибут для объекта. Я решил, что CFBitArray - это путь.CFBitVector хранится как атрибут объекта coredata

Я пытаюсь выяснить, как сохранить это за объект:

Вот пример

Объект

атрибуты: Имя: Fingerprint ("+01010101010101010101010110") и т.д. ...

Это используется, чтобы попытаться соответствовать мастер печати

Любой су 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

ответ

1

Вам нужно будет преобразовать это в/из чего-то, что Core Data понимает и сохраняет преобразованное значение. Есть пара возможностей, которые связаны с получением фактических битов через CFBitVectorGetBits. После того, как вы есть, что вы можете

  • Сохранить их в NSData используя нечто вроде +dataWithBytes:length:, и положить, что в атрибуте двоичного типа на управляемый объект. Или ...
  • В зависимости от количества используемых вами байтов сохраните их в NSNumber, используя что-то вроде +numberWithLong: (или то, что достаточно для количества бит). Затем поместите это в один из целых типов Core Data - снова, выбрав любой размер, соответствующий вашим битам.

Вы можете сделать преобразование, либо с помощью пользовательских методов аксессоров на вашем NSManagedObject подкласса, или с помощью трансформируемых Core Data типа и классом трансформатора значения атрибута. Для последнего вы должны подклассифицировать NSValueTransformer и реализовать свои преобразования там (в Apple есть несколько примеров этого).

В зависимости от того, что вы на самом деле делаете, вам может потребоваться использовать NSIndexSet вместо CFBitVectorRef. Если ничего другого, он соответствует NSCoding - это означает, что вы можете использовать изменяемый атрибут, но полагаться на трансформатор значений по умолчанию Core Data вместо того, чтобы писать свой собственный.

Возможно, вам также проще просто использовать один из целочисленных типов и полагаться на побитовые операторы, чтобы определить, установлен ли бит. Тогда вам не нужно делать что-либо особенное с Core Data, вы просто выбираете тип целочисленного размера соответствующего размера.

+0

Звуки выполнимы. Я принимаю ваши предложения nsindexset, но я думаю, что это будет слишком длинным для int (отпечаток пальца - это комбинация 1500 1 с и 0), это должно свести к минимуму работу с основными данными. –

+0

Да, 1500 бит - это много для числового типа. :) –

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

Тогда вы можете хранить что отпечатков пальцев в Core Data приписывать это двоичных данных.

В зависимости от типа 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

Можете ли вы привести мне пример? –

Смежные вопросы