FMDB更新或插入查询问题“未知错误调用sqlite3_step(5:数据库被锁定)eu”

时间:2016-11-29 10:58:49

标签: ios xcode sqlite ios10 fmdb

let dBName = FMDatabase(path: databasePath as String) 
var isUpdated = Bool() 
            if dBName.open()
            {
                isUpdated = dBName.executeUpdate("UPDATE TableName SET \(Column1)=?, \(Column2)=?, \(status)=? WHERE \(ID)=?", withArgumentsInArray: [Column1, Column2, strStatus, strID])
                if isUpdated == true{

                 print("sucess")

                }
                else{

                    print("Error: isUpdated\(dBName.lastErrorMessage())")
                    print("Error: lasterrorcode \(dBName.lastErrorCode())")
                }

                dBName.close()
            }
            else
            {
                print("Error: \(dBName.lastErrorMessage())")
            }

总是显示错误未知错误,调用sqlite3_step(5:数据库被锁定)eu。
数据库名称为DatabaseName.sqlite,数据库可在DocumentDirectory中使用 数据库路径是:

let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    let filePath = url.URLByAppendingPathComponent(dbName).path!
  

如果文件名是DatabaseName.db正常工作,则没有任何数据库锁定问题,但如果文件名是DatabaseName.sqlite,则会发现同样的问题

3 个答案:

答案 0 :(得分:1)

同时检查您是否通过任何其他应用程序访问相同的DB文件,例如通过SQLite Manager等。如果您在多线程环境中切换到FMDatabaseQueue 检查一下 fmdatabasequeue and thread safety

答案 1 :(得分:0)

值5是 SQLITE_BUSY ,这意味着数据库当前正忙。(例如,先前的SQLite调用未正确完成并关闭)。

可能的错误条件是。

  1. 如果您在没有任何输出的情况下返回executeUpdate方法。它将以静默方式锁定数据库。因此,请确保dBName.close()完美运行。

  2. 检查可能导致executeUpdate静默返回的SQL语法。

  3. 记录您的SQL语句并检查语法

答案 2 :(得分:0)

签名很多,请检查是否使用了适当的签名:

database.executeQuery
database.executeUpdate
database.executeStatements