【问题标题】:sqlite issue in iOS accessing two table at same timeiOS中的sqlite问题同时访问两个表
【发布时间】:2015-02-18 05:02:54
【问题描述】:

我希望一切顺利,我有一个关于 sqlite 的查询。 是否有可能两个不同的 sqlite 表访问一个 . 前任。 我有表 A 和 B。可以同时访问 A 和 B。插入更新表值。

我在 myDatabase(test_db.sqlite) 中有两个不同的表,Table1 和 table2。

表 1 只能由主线程访问。 表 2 只能由后台线程访问。

现在让 c. 我已经使用后台线程打开了数据库连接……用于将值插入 table2。 在将值插入表 2 时…………。我的主线程尝试同时打开同一个数据库连接以从表 1 中检索数据……并且应用程序崩溃。

如何同时打开同一个数据库连接。

请检查此编辑一

【问题讨论】:

  • 你应该知道join和bridge table
  • 你能把它提炼成一个问题吗?当您尝试同时进行多个插入时,您会遇到什么错误?你用什么代码来做这个?
  • 一般情况下,我们创建一个全局数据库实例来处理数据库操作。您可以分别为您的两个表触发数据库查询,方法是在第一个成功时执行第二个。这样可以避免任何歧义(如果存在) .如需更多信息,请与我们分享您的代码。
  • 您可以使用 performSelectorOnMainThread 方法并将 waitUntillDone 设置为 YES。
  • 当我试图访问数据库时得到锁

标签: ios objective-c iphone ios7 sqlite


【解决方案1】:

[编辑]

您在不同线程中访问数据库时遇到问题。你可以使用线程安全模式来处理这个问题。

来自SQL docs

SQLite 支持三种不同的线程模式:

单线程。在这种模式下,所有互斥锁都被禁用,SQLite 一次在多个线程中使用是不安全的。

多线程。在这种模式下,SQLite 可以被多个线程安全地使用,前提是没有在两个或多个线程中同时使用单个数据库连接。

序列化。在序列化模式下,SQLite 可以不受限制地被多个线程安全使用。

所以,你可以使用SQLITE_THREADSAFE编译时参数来选择线程模式。

我建议你在每个线程中打开不同的数据库连接,或者在序列化模式下重建 SQLite(使用 SQLITE_THREADSAFE=1)。


旧答案:

如果您不提供您收到的确切错误,则很难回答您的问题。但是,假设您的查询没问题,最可能的原因是您没有正确处理您的 sqlite 流。

我想您的问题是您正在更新表“A”,然后在尝试更新表“B”时它崩溃了。这就是您尝试创建一个查询来更新它们的原因。

因此,在重用 sqlite3_stmt 进行第二次查询之前,您应该首先调用 sqlite3_finalize(yourStatement) 以从内存中释放语句,然后,如果您想进行第二次查询,只需再次调用 sqlite3_prepare_v2 ,因此数据库已准备好接受之后的下一个查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-10
    • 2020-08-27
    • 1970-01-01
    • 2012-07-03
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多