核心数据功能,无需使用coredata

时间:2012-10-05 15:22:34

标签: objective-c ios sqlite core-data

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

我正在寻找有关构建项目的建议,以便使用sql语句填充最少量的代码来进行数据库交互。有人可以就如何实现这一目标提出建议吗?

由于

2 个答案:

答案 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)

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

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

这是很多工作,无论你怎样看待它。