也许这个解决方案可以帮助您保留核心数据并为内容提供加密。
假设我们有一个名为 MyObject 的 Core Data 对象,它具有一个属性 MyData。然后在 CoreData 模型中为该属性设置属性瞬态。现在定义属性类型为Binary Data的第二个属性 MySecretData 。这是存储实际数据的地方。
现在在 NSManagedObject 子类上创建一个类别,如下所示:
@interface MyObject (Access)
- (NSData*)myData;
- (void)setMyData:(NSData*)value;
@end
@implementation MyObject (Access)
- (NSData*)MyData {
NSMutableData * tmpValue;
[self willAccessValueForKey:@"MyData"];
tmpValue = [self primitiveValueForKey:@"MyData"];
[self didAccessValueForKey:@"MyData"];
if(!tmpValue) {
NSData *encryptedData = [self valueForKey:@"MySecretData"];
if(encryptedData) {
tmpValue = [NSMutableData dataWithData:encryptedData];
BOOL success = [tmpValue decryptWithKey:nil];
if (!success) {
// Error Handling here
}
tmpValue = [tmpValue zlibInflate];
[self setPrimitiveValue:tmpValue forKey:@"MyData"];
}
else {
tmpValue = nil;
[self setMyData:tmpValue];
}
}
return tmpValue;
}
- (void)setMyData:(NSData *)data {
NSData* tmpValue;
[self willAccessValueForKey:@"MyData"];
tmpValue = [self primitiveValueForKey:@"MyData"];
[self didAccessValueForKey:@"MyData"];
if([tmpValue isEqual:data])
return;
[self willChangeValueForKey:@"MyData"];
[self setPrimitiveValue:data forKey:@"MyData"];
[self didChangeValueForKey:@"MyData"];
NSMutableData* encryptedData = nil;
if (data != nil) {
encryptedData = [NSMutableData dataWithData:data];
encryptedData = [encryptedData zlibDeflate];
BOOL success = [encryptedData encryptWithKey:nil];
if (!success) {
// Error Handling here
}
}
[self setPrimitiveValue:encryptedData forKey:@"MySecretData"];
}
@end
在这种情况下,数据被加密并被压缩。从您的代码中,您可以照常访问 MyData。在核心数据库中,所有值都将被加密。当然,您必须使用适当的加密功能。