将sqlite数据库转换为nsdata并返回

时间:2013-11-16 09:47:39

标签: ios objective-c sqlite nsdata nsfilemanager

我将sqlite文件转换为NSData以将其保存在文档目录中。现在我将它转换为sqlite文件并将该文件保存在文档目录中,但新的sqlite文件不是有效的sqlite文件,并且代码现在不会从中读取数据。下面是我用来将NSData转换为sqlite文件的代码:

-(void)openDataBase{
// First, test for existence.
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Demo.sqlite"];
success = [fileManager fileExistsAtPath:writableDBPath];

if (success)
{
    NSData *data=[[NSData alloc]initWithContentsOfFile:writableDBPath];
    NSString * _key = @"111";
    NSData *decryptedData = [data AES256DecryptWithKey:_key];
  [fileManager createFileAtPath:writableDBPath contents:decryptedData attributes:nil];
    return;
}
// The writable database does not exist, so copy the default to the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Demo.sqlite"];

NSData *SqliteData = [NSData dataWithContentsOfFile:defaultDBPath];

NSString * _key = @"111";

NSData *encryptedData = [SqliteData AES256EncryptWithKey:_key];

success= [fileManager createFileAtPath:writableDBPath contents:encryptedData attributes:nil];
if (!success)
{
    NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);} }


我的代码有什么问题,我想我一直在创建新的sqlite文件但是如何解决这个问题呢? 任何人都可以帮助我如何将NSData转换为sqlite文件。 我应该在库中编写sqlite文件,然后从那里访问它吗? 但每次更新都会解密sqlite文件,我必须解密它。

2 个答案:

答案 0 :(得分:0)

如果文件已存在,您的代码将解密并覆盖它。如果没有,则将默认数据库的加密副本写入磁盘。因此,默认情况下,您有一个无法使用的加密文件。

答案 1 :(得分:0)

要在app中使用Sqlite,我将它存储在应用程序的库沙箱(NSLibraryDirectory)中,然后我总是将它保存在加密后的文档目录中,并且我注意到lib sqlite中的文件修改时间(NSFileModificationDate),当时间被修改时,我解密后,从Doc目录数据库中替换库数据库(AES256DecryptWithKey :),这样我就可以在应用程序中成功实现它。
这是一个很好的经历。
快乐的编码...... !!!!!!