Xamarin.android SQLite序列化模式

Xamarin.android SQLite序列化模式,xamarin.android,xamarin,zumero,Xamarin.android,Xamarin,Zumero,我有一个XamarinAndroid项目,当时使用的是mono.data.sqlite,在多线程方面有问题,所以我尝试了Zumero组件。我仍然有问题。我正在尝试将序列化模式设置为带有在中序列化的标志SQLITE\u CONFIG\u。我仍然会遇到随机崩溃。我可以用Zumero设置序列化标志吗?除了从源代码重新编译SQLite之外,还有其他建议吗 谢谢 布莱恩我以前就有这个问题。尽管有相互矛盾的建议,但以下是我如何停止获取异常的原因: 在所有线程之间共享SQLiteConnection的静态实例

我有一个XamarinAndroid项目,当时使用的是mono.data.sqlite,在多线程方面有问题,所以我尝试了Zumero组件。我仍然有问题。我正在尝试将序列化模式设置为带有在中序列化的标志SQLITE\u CONFIG\u。我仍然会遇到随机崩溃。我可以用Zumero设置序列化标志吗?除了从源代码重新编译SQLite之外,还有其他建议吗

谢谢


布莱恩

我以前就有这个问题。尽管有相互矛盾的建议,但以下是我如何停止获取异常的原因:

在所有线程之间共享SQLiteConnection的静态实例。这是安全的,因为SQLite连接只是一个文件指针,不像传统的数据连接

将所有SQLite查询/插入/更新包装在一个互斥锁中,并将SQLite连接的statix实例作为锁。有人建议我在使用序列化模式时不需要这样做,但我对它的体验有所不同

lock(myStaticConnection) {
   myStaticConnection.Query<Employee>("....");
}
lock(myStaticConnection){
myStaticConnection.Query(“…”);
}
作为备份,我还使用一些添加的重试逻辑来封装每个查询。不确定SQLite是否自己做到了这一点(我看到了busytimeout的引用,有人声称它已经消失了?)。大概是这样的:

    public static List<T> Query<T> (string query, params object[] args) where T : new()
    {
        return Retry.DoWithLock (() => {
            return Data.connection.Query<T> (query, args);
        }, Data.connection, 0);
    }

    public static T DoWithLock<T>(
        Func<T> action,
        object lockable,
        long retryIntervalTicks = defaultRetryIntervalTicks,
        int retryCount = defaultRetryCount)
    {
        return Do (() => {
            lock (lockable) {
                return action();
            }
        });
    }

    public static T Do<T>(
        Func<T> action,
        long retryIntervalTicks = defaultRetryIntervalTicks,
        int retryCount = defaultRetryCount)
    {
        var exceptions = new List<Exception> ();

        for (int retry = 0; retry < retryCount; retry++) {
            try{
                return action();
            } catch (Exception ex) {
                exceptions.Add (ex);
                ManualSleepEvent (new TimeSpan(retryIntervalTicks));
            }
        }

        throw new AggregateException (exceptions);
    }
公共静态列表查询(字符串查询,参数对象[]args),其中T:new()
{
返回Retry.DoWithLock(()=>{
返回Data.connection.Query(Query,args);
},数据连接,0);
}
公共静态T形锁(
Func action,
对象可锁定,
long retryIntervalTicks=默认retryIntervalTicks,
int retryCount=defaultRetryCount)
{
返回Do(()=>{
锁定(可锁定){
返回动作();
}
});
}
公共静态不做(
Func action,
long retryIntervalTicks=默认retryIntervalTicks,
int retryCount=defaultRetryCount)
{
var异常=新列表();
for(int retry=0;retry
看一看