【问题标题】:How to resolve the error : sqlite3 database is locked in iPhone.如何解决错误:sqlite3 数据库被锁定在 iPhone 中。
【发布时间】:2014-07-20 23:36:12
【问题描述】:

当我调试代码时,它给了我以下错误:sqlite3_step 关闭数据库后返回 error 21。 之后,当我想做插入或更新等操作时,我收到此错误:数据库已锁定。

此错误表示什么以及如何解决此错误? 如果有人对此有任何想法,请指导我这里出了什么问题。

【问题讨论】:

  • “数据库已锁定”表示仍有一些活动事务。为避免此错误,请修复代码中的错误。
  • 如何知道哪个事务活跃或不活跃。 @CL。
  • 其他人应该如何知道您的代码如何处理事务和连接?

标签: ios objective-c sqlite


【解决方案1】:

根据我在 Objective-C 中集成 SQLite 的说法,您必须有一个桥接器或包装器,无论是您自己的还是来自第三方的,例如 FMDB。您的问题太抽象了,这取决于您如何实现数据检索逻辑。

SQLITE_MISUSE 是 21,您可以参考整个列表 here。最正确的是你在滥用 ;) SQLite。如果您是 SQLite 和 Objective-C 的新手,最好使用一些库来与您的数据库通信。

【讨论】:

  • 您可以直接使用 Objective-C 中的 SQLite——不需要“包装器”(尽管它们经常被使用)。
【解决方案2】:

为此,您必须正确打开和关闭数据库。如果数据库已经打开并且您正在尝试打开它,那么它将被锁定。

【讨论】:

  • 打开它并保持打开状态,直到应用程序关闭。并且第二次打开不会导致错误 - 这是由于在一个仍在飞行中时开始第二个事务。
  • 正是我想说的,如果不使用,则在第一次操作后关闭数据库,如果要开始第二次事务则再次打开。
  • 不,让数据库保持打开状态,除非您只是偶尔使用它。无需为每个事务打开和关闭数据库。
  • 当我打开数据库时,它以多线程开始。 thread_safe() sqlite 函数在关闭数据库返回后给我 2. 如何使用单线程完美地打开和关闭数据库?当关闭数据库线程也被挂起。可能吗? @HotLicks
  • 无论您如何打开数据库,或如何配置线程模式,如果您是多线程,则需要使用外部互斥锁来确保一次只尝试一个事务。是的,SQLite 可以配置为检测并发访问,但是在操作中途获得“数据库锁定”是很难恢复的。
猜你喜欢
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
相关资源
最近更新 更多