【问题标题】:convert sqlite database to nsdata and back将 sqlite 数据库转换为 nsdata 并返回
【发布时间】:2013-11-29 18:51:33
【问题描述】:

我将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 文件,我必须解密它。

【问题讨论】:

  • 赞成以新的方式尝试事物..

标签: ios objective-c sqlite nsdata nsfilemanager


【解决方案1】:

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

【讨论】:

  • 嗨,韦恩,谢谢..!!!在这里,我的要求是使用单个加密文件,但是当我需要在 sqlite 文件中插入/更新时,它应该解密,以便我可以用新数据更新它,然后再次对其进行加密,我在 plist 中启用文件共享 / true 所以我想要如果用户尝试从 iTunes 访问此文件,她将能够访问它但无法编辑它。
  • 您可以将加密的每条数据存储在 SQLite 存储中,而不是加密整个文件。将未加密的文件保存到磁盘,即使是暂时的也有点失败......
【解决方案2】:

要在应用程序中使用 Sqlite,我将其存储在应用程序的库沙箱 (NSLibraryDirectory) 中,然后我始终将其保存在加密后的文档目录中,并且我在 lib sqlite 中记录文件修改时间 (NSFileModificationDate) 何时修改时间,我解密后(AES256DecryptWithKey :) 替换 Doc 目录 DB 中的库数据库,这样我在应用程序中成功实现了它。
这是很好的体验。
编码愉快……!!!!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 2012-01-11
    • 2012-01-16
    • 1970-01-01
    • 2015-10-11
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多