【问题标题】:Database disk image is malformed in MonoTouchMonoTouch 中的数据库磁盘映像格式错误
【发布时间】:2012-02-16 08:25:32
【问题描述】:

我正在使用 Monotouch 5 开发一个多线程消息传递应用程序。经过几天的操作,一些客户收到错误Database disk image is malformed。我正在使用我在互联网上找到的 Kueger Systems 的 SQLite.cs 来访问 SQLite 数据库。

似乎存在多个线程访问数据库的问题(这种情况经常发生)。我在某处读过有关如何编译数据库的选项(单线程、多线程、序列化)。我会以某种方式指定吗?

我想继续从后台线程更新数据库,而不破坏它。我做错了什么?

【问题讨论】:

    标签: ios multithreading sqlite xamarin.ios


    【解决方案1】:

    你可以告诉sqlite如何处理多线程。诀窍是在应用程序的早期非常进行(因为一旦 sqlite 被初始化,更改它就太晚了)。

    对于 SQLite.cs,您可以使用 this 代码执行此操作。

    Mono.Data.Sqlite.dll 中,您可以致电Mono.Data.Sqlite.SqliteConnection.SetConfig (Mono.Data.Sqlite.SQLiteConfig.*); 执行相同操作。

    在这两种情况下,有效值(用于配置枚举)都记录在 here

    【讨论】:

    • 我使用的是 SQLite.cs,所以我在 FinishedLaunching 的第一行发出了以下语句: Console.WriteLine(SQLite.SQLite3.Config(SQLite.SQLite3.ConfigOption.MultiThread));但是它返回 21。这是什么意思?我在 Result 枚举中找不到它。我做得太早了吗?
    • #define SQLITE_MISUSE 21 /* Library used incorrectly */ 我的猜测是还不够早(看不出多早会成为问题)。您是否将其放在 FinishedLaunching 方法的开头?
    • 是的,这是 FinishedLaunching 的第一行。在此之前我需要做些什么吗?是不是太早了? (例如需要先指定数据库路径)?
    • AFAIK 不能太早了。错误 (21) 何时发生? MultiThread 也可能不是你想要的。例如。您不能在多个线程之间共享单个连接,每个线程都必须有自己的(您可能想尝试Serialized)。阅读sqlite.org/threadsafe.html了解更多详情。
    • 感谢提示,我也尝试过使用Serialized,似乎更合适。但是,上面的 Console.Writeline 输出 21。这是我项目中执行的第一行代码,就在 FinishedLaunching 的下方。会发生什么?
    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多