数据库被锁定错误sqlite Ios

时间:2014-01-18 12:58:53

标签: ios iphone sqlite

我正在使用sqlite进行项目。在我的项目中,我正在插入,获取并更新数据到datbase.But有时我的数据库的geeting错误被锁定,没有这样的表:tablename.I已经检查了我的代码sqlite3_open,sqlite3_prepare_v2,sqlite3_step,sqlite3_finalize和sqlite3_close。但我得到了问题。任何人都可以帮助我

1 个答案:

答案 0 :(得分:2)

当您尝试从同一数据库连接同时对数据库执行两个不兼容的事情时,会出现此错误代码。例如,如果您位于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。但SELECT是 在sqlite3_reset()或sqlite3_finalize()之前没有完全完成 被称为。

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

  2. 尝试在SELECT处于活动状态时写入表 表。

    • 截至登记[3355](版本3.3.7之后的2006-08-16),现在是 允许的。
  3. 尝试在同一张桌子上同时进行两次SELECT 多线程应用程序,如果没有设置sqlite。

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