【问题标题】:Failed to create SQLite3 database with file protection in iOS无法在 iOS 中创建具有文件保护的 SQLite3 数据库
【发布时间】:2013-01-21 04:41:33
【问题描述】:

背景:我一直在观看 WWDC 2011 - 208 保护 iOS 应用程序。他们提到了如何使用称为 NSFileProtection 的文件加密来保护我们的数据。虽然我发现了automatic method mentioned (@38:00) is bugged,但我希望手动方式(@37:00)不是。我尝试对图像使用文件保护,一切都很好。只有我无法创建的 Sqlite。

问题:我尝试使用sqlite3_open_v2 创建SQLite3 数据库(没有核心数据),并将SQLITE_OPEN_FILEPROTECTION_COMPLETE 作为第三个参数的标志传递。它不返回SQLITE_OK

代码:

if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_FILEPROTECTION_COMPLETE, NULL) == SQLITE_OK){
   //everything works
}else{
  //failed
}

更新:
正如 borrrden 所提到的,两者都导致了以下错误代码: SQLITE_MISUSE(库使用不正确)


更新 2: borrrden 的第二条评论指出两个标志的需要是正确的。它按照代码工作:

if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE|SQLITE_OPEN_FILEPROTECTION_COMPLETE, NULL) == SQLITE_OK)

【问题讨论】:

  • 只是为了好玩,试试SQLITE_OPEN_FILEPROTECTION_COMPLETE|SQLITE_OPEN_CREATE 如果这不起作用,然后发布错误。您必须从 sqlite API 获取它。如果你不知道怎么做……那么恐怕你还没有使用 sqlite 的业务。
  • @borrrden 谢谢,我对 SQLite 比较陌生。我查找了错误代码并更新了我原来的问题。请看一看。
  • 参数组合无效。查看其他 sqlite 示例,我认为您还需要添加 SQLITE_OPEN_READWRITE 以及 SQLITE_OPEN_CREATE
  • @borrrden 你是对的,请回答这个问题,以便我将其标记为答案。我还用你的答案更新了我的问题。

标签: ios database xcode encryption sqlite


【解决方案1】:

Sqlite 对您的标志中缺少文件访问模式感到不满。它不知道是否应该打开它可写,或者如果它不存在是否创建它。因此,将以下两个标志与您当前使用的标志一起添加:

SQLITE_OPEN_READWRITE
SQLITE_OPEN_CREATE

这表明 sqlite 应该打开一个可写数据库,如果它不存在则创建它。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 2012-05-19
    • 2011-08-23
    相关资源
    最近更新 更多