1

我正在维护一个 iOS 应用程序,该应用程序当前使用 Core Data 从数据库中获取数据并填充表视图。提出了一个新要求,即必须使用 SQLCypher 对整个数据库进行加密,并且根据我的研究,Core Data 拒绝使用密码。因此决定删除 coredata 支持,现在必须手动进行数据库调用。在这种情况下,是否有任何库/项目可以模拟 CoreData 中 NSFetchedResults 的功能来管理数据库交互并与 TableViews 配合得很好?

我正在寻找有关以最少的代码散布 sql 语句来进行数据库交互的方式来构建项目的建议。任何人都可以就如何实现这一点提出建议吗?

谢谢

4

2 回答 2

0

也许这个解决方案可以帮助您保留核心数据并为内容提供加密。

假设我们有一个名为 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。在核心数据库中,所有值都将被加密。当然,您必须使用适当的加密功能。

于 2012-10-05T15:51:43.797 回答
0

我认为没有一个好的、简单的答案。一些可能性:

  • iOS 可以自动加密其文件系统。这对 Core Data 来说是透明的,你只需要在访问任何文件之前确保它是“解锁的”。显然这不会使用 SQLCypher (不管是什么)
  • 我不确定 SQLCypher 是如何工作的,但您也许可以编写自己的 NSPersistentStore 与加密数据库对话。同样,这对 Core Data 来说是透明的,尽管这可能是不可能的。这完全取决于 SQLCypher 的工作方式
  • 编写您自己的类似 Core Data 的层。据我所知,没有什么能比得上它......我的意思是,当Apple总是可用时,你为什么要自己编写(如果你至少有iOS3以上的东西)

这是很多工作,无论你怎么看。

于 2012-10-05T16:08:09.450 回答