我使用 SQLCipher 在我的应用程序中加密 sqlite 数据库。一切正常,但我的应用程序在获取数据库期间运行缓慢。我更改了PRAGMA kdf_iter到 4000 仍然很慢。加密之前我没有任何问题。
-(NSError *) openDatabase {
NSError *error = nil;
NSString *databasePath = [self getDatabasePath];
const char *dbpath = [databasePath UTF8String];
int result = sqlite3_open_v2 (dbpath, &db , SQLITE_OPEN_READWRITE , NULL);
if (result == SQLITE_OK) {
sqlite3_exec(db, [@"PRAGMA kdf_iter = '4000';" UTF8String], NULL, NULL, NULL);
sqlite3_exec(db, [@"PRAGMA key = 'password'" UTF8String], NULL, NULL, NULL);
NSLog(@"Password is correct , Database is Activated");
sqlite3_exec(db, [@"PRAGMA cipher = 'aes-256-cfb';" UTF8String], NULL, NULL, NULL);
}
else {
NSLog(@"Incorrect password!");
}
if (result != SQLITE_OK) {
const char *errorMsg = sqlite3_errmsg(db);
NSString *errorStr = [NSString stringWithFormat:@"The database could not be opened: %@",[NSString stringWithCString:errorMsg encoding:NSUTF8StringEncoding]];
error = [self createDBErrorWithDescription:errorStr andCode:kDBFailAtOpen];
}
return error;
}
最后我可以优化我的SQLCipher 性能尼克·帕克的有用指导。
正如他所说:
对于最佳 SQLCipher 性能有一些非常重要的准则:
- 不要重复打开和关闭连接,因为根据设计,密钥派生的成本非常昂贵。频繁打开/关闭数据库连接(例如,对于每个查询)是导致性能问题的一个非常常见的原因,通常可以使用单例数据库连接轻松解决这些问题。
- 使用事务来包装插入/更新/删除操作。除非在事务范围内执行,否则每个操作都将在其自己的事务中发生,这会使速度减慢几个数量级
- 确保您的数据标准化(即,使用良好实践将数据分离到多个表中以消除冗余)。不必要的数据重复会导致数据库膨胀,这意味着 SQLCipher 需要操作更多页面
- 确保用于搜索或连接条件的任何列都已建立索引。如果不这样做,SQLCipher 将需要跨大量页面执行完整数据库扫描
- 如果进行大量删除、更新等操作,请定期进行清理以确保数据库紧凑。
要诊断特定查询语句的性能问题,运行解释查询计划针对特定查询的命令。
如果您不确定哪些查询性能不佳,SQLCipher 包含一个名为密码配置文件允许分析查询及其各自的执行时间(以毫秒为单位)。
这是参考链接 https://discuss.zetetic.net/t/sqlcipher-performance/14
非常感谢尼克·帕克。
还有这个blog http://blog.thomasbandt.de/39/2433/de/blog/performance-optimization-of-sqlite-on-ios-with-xamarin.html对我来说非常有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)