iOS 读取数据时收到 Sqlite 错误数据库被锁定

Posted

技术标签:

【中文标题】iOS 读取数据时收到 Sqlite 错误数据库被锁定【英文标题】:Received Sqlite error database is locked in iOS when reading data 【发布时间】:2021-11-20 21:34:19 【问题描述】:

执行以下查询后,我收到错误“数据库已锁定”

func readIdComposicagoPelagem(_ idEspecie:Int, _ idPelagem:Int, _ idStPelagem:Int) -> Int 
    let idComp = 0
    
    let queryStatementString = "SELECT idComp FROM RES_COMP_PELAGEM where idEspecie = \(idEspecie) and idPelagem = \(idPelagem) and idStPelagem = \(idStPelagem);"
    var queryStatement: OpaquePointer? = nil
    
    if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK 
        while sqlite3_step(queryStatement) == SQLITE_ROW 
            let ident = sqlite3_column_int(queryStatement, 0)
            debugPrint("Query Result RES_COMP_PELAGEM:")
            debugPrint("ident: \(ident) ")
    
            return Int(ident)
        
     else 
        debugPrint("SELECT statement could not be prepared - RES_COMP_PELAGEM")
    
    sqlite3_finalize(queryStatement)        
    
    return idComp

运行上述函数后,所有其他修改数据的查询(删除、更新、插入)都不再起作用。 但 select 语句仍然有效。

我该如何解决这个问题?

我从不使用 sqlite3_close() 并且它在一段时间前工作正常。但是现在我不知道为什么上面的函数会锁定数据库。

知道如何解决这个问题吗?

【问题讨论】:

在while循环中......你有一个返回:return Int(ident).,然后,代码永远不会到达该行:sqlite3_finalize(queryStatement) 【参考方案1】:

基于@TonyMkenu 的评论

我更改代码以解决问题。

func readIdComposicagoPelagem(_ idEspecie:Int, _ idPelagem:Int, _ idStPelagem:Int) -> Int 
    var idComp = 0
    
    let queryStatementString = "SELECT idComp FROM RES_COMP_PELAGEM where idEspecie = \(idEspecie) and idPelagem = \(idPelagem) and idStPelagem = \(idStPelagem);"
    var queryStatement2: OpaquePointer? = nil
    
    if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement2, nil) == SQLITE_OK 
        while sqlite3_step(queryStatement2) == SQLITE_ROW 
            let ident = sqlite3_column_int(queryStatement2, 0)
            debugPrint("Query Result RES_COMP_PELAGEM:")
            debugPrint("ident: \(ident) ")
    
            idComp = Int(ident)
            
        
     else 
        debugPrint("SELECT statement could not be prepared - RES_COMP_PELAGEM")
    
    sqlite3_finalize(queryStatement2)
    
    return idComp

【讨论】:

以上是关于iOS 读取数据时收到 Sqlite 错误数据库被锁定的主要内容,如果未能解决你的问题,请参考以下文章

CoreData和SQLite多线程访问时的线程安全问题

带有 SQLite 错误的实体框架:从商店提供者的数据读取器读取时发生错误

试图在 python 中读取我的 .json 数据但不断收到错误

多线程如何并发访问SQLite数据库

SQLite 数据库在读取时写入

解决方案:sqlite 对datetime型的数据读取错误