ios - Ios sqlite 数据库被锁定错误

标签 ios iphone sqlite

我正在使用 sqlite 进行一个项目。在我的项目中,我正在向数据库插入、获取和更新数据。但是有时我会遇到数据库被锁定的错误,并且没有这样的表:tablename。我已经检查了我的代码sqlite3_open、sqlite3_prepare_v2、sqlite3_step、sqlite3_finalize 和 sqlite3_close。但我遇到了问题。有人可以帮我解决吗

最佳答案

当您尝试从同一数据库连接同时对数据库执行两项不兼容的操作时,会出现此错误代码。例如,如果您正在执行 SELECT 语句并尝试 DROP SELECT 正在读取的表之一,您将收到 SQLITE_LOCKED 错误。这是一个示例(使用 Tcl):

db eval {SELECT rowid FROM ex1} {
  if {$rowid==10} {
    db eval {DROP TABLE ex1}  ;# will give SQLITE_LOCKED error
  }
}

请注意,SQLITE_LOCKED 错误与 SQLITE_BUSY (5) 不同。 SQLITE_BUSY 表示另一个数据库连接(可能在另一个进程中)正在以阻止您使用数据库的方式使用该数据库。 SQLITE_LOCKED 表示争用源是内部的,并且来自收到 SQLITE_LOCKED 错误的同一数据库连接。

以下是出现 SQLITE_LOCKED 错误的其他原因:

  1. 在执行 SELECT 语句时尝试创建或删除表或索引 仍在等待中。

    • 有时人们认为他们已经完成了 SELECT 语句 因为 sqlite3_step() 已返回 SQLITE_DONE。但选择是 直到 sqlite3_reset() 或 sqlite3_finalize() 完成后才真正完成 被召唤。

    • 截至 checkin [3902](2007-05-02 版本 3.3.17 之后),这是 现在允许 CREATE 语句。

  2. 当 SELECT 在同一表上处于事件状态时尝试写入该表 table 。

    • 截至 checkin [3355](2006-08-16 版本 3.3.7 之后),现在是 允许。
  3. 尝试在同一时间对同一个表执行两个 SELECT
    多线程应用程序,如果 sqlite 未设置为这样做。

  4. fcntl(3, 对数据库文件的 F_SETLK 调用失败。这可能是由于
    例如,NFS 锁定问题。此问题的一种解决方案是 将数据库移走,然后将其复制回来,以便它有一个新的 inode
    值。

关于ios - Ios sqlite 数据库被锁定错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204431/

相关文章:

iphone - IOS7中的图像背景问题

sqlite - sqlite 尝试创建数据库时出现语法错误

ios - Xcode9 iOS11 应用程序版本中缺少 CFBundleIconName

ios - NSManagedObject setter 给我 [ MyObject setName :]: unrecognized selector sent to instance

ios - AVPlayer ReadyToPlay 枚举是一个未解析的标识符

java - Android插入日期到数据库datePicker报错

ios - 在 iOS 生命周期中何时打开和关闭 SQlite 数据库?

ios - 流布局不支持负尺寸或零尺寸

iphone - CoreAudio Audio Graph 中的自定义音频效果 - 渲染回调

iphone - 如何在选择器 View 列表更新时获取调用的函数?