我正在维护一个iOS应用程序,该应用程序当前使用Core Data从数据库中获取数据并填充表格视图。新的要求已经出现,整个数据库必须使用SQLCypher进行加密,并且根据我的研究,Core Data拒绝与密码一起使用。因此,已经决定删除coredata支持,现在必须手动进行数据库调用。在这种情况下,是否有任何库/项目模拟CoreData中NSFetchedResults的功能,管理数据库交互并与TableViews一起使用?
我正在寻找有关构建项目的建议,以便使用sql语句填充最少量的代码来进行数据库交互。有人可以就如何实现这一目标提出建议吗?
由于
答案 0 :(得分:0)
也许此解决方案可以帮助您保留Core Data并为内容提供加密。
假设我们有一个名为MyObject的Core Data对象,其中包含一个属性MyData。然后在CoreData模型中为此属性设置属性瞬态。现在使用属性类型二进制数据定义第二个属性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。在核心数据库内,所有值都将被加密。当然,你必须使用适当的加密功能。
答案 1 :(得分:0)
我认为没有一个好的,简单的答案。一些可能性:
这是很多工作,无论你怎样看待它。