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 错误数据库被锁定的主要内容,如果未能解决你的问题,请参考以下文章
带有 SQLite 错误的实体框架:从商店提供者的数据读取器读取时发生错误