【问题标题】:FMDatabaseQueue was called reentrantly errorFMDatabaseQueue 被称为可重入错误
【发布时间】:2018-02-14 04:07:56
【问题描述】:

我的 sqlite 数据库有一个包装器,它创建对象并处理所有数据库查询。它仅包含 SELECT 查询。它被很好地分解为可重复使用的部分并且运行良好。

最近我添加了一个运行缓慢的查询(多个连接),所以我想在后台队列上运行它。

我创建了一个 FMDatabaseQueue 并将我对 db.executeQuery 的所有调用封装在 queue.inDatabase { db in ... } 中。

但是当 FMDB 检测到我在另一个 inDatabase 呼叫中呼叫 inDatabase 时,它会爆炸:

inDatabase: was called reentrantly on the same queue, which would lead to a deadlock.

处理这个问题的正确方法是什么?看来我需要重构我的代码以确保永远不会有对 db 的嵌套调用,但我不明白为什么,因为 sqlite 在同时读取方面没有问题。

【问题讨论】:

    标签: fmdb


    【解决方案1】:

    FMDatabaseQueue 无法检测您是否要进行更新或启动事务,或者您是否只进行读取。所以它总是对可重入调用说“不”。

    如果您只进行读取,则可以改为使用连接池。

    【讨论】:

    • 谢谢,不知道 FMDatabasePool!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2021-10-07
    • 2013-02-09
    • 2014-10-16
    • 2023-03-11
    • 1970-01-01
    • 2018-04-08
    相关资源
    最近更新 更多