SQLiteWinRT和后台任务访问

时间:2014-04-29 13:25:14

标签: sqlite windows-phone-8 windows-phone mutex

我已经看了几篇关于处理后台计划任务和前台应用程序之间同步的帖子(这是Windows Phone 8)。问题是可能不同的进程可以访问/编辑IsolatedSettingsStorage.ApplicationSettings或我的本地SQLite数据库,如果它没有正确同步,则可能存在损坏问题。

我使用互斥锁来保护对IsolatedSettingsStorage.ApplicationSettings的访问权限,如下所示:

    public static string GetApplicationSetting(string Key)
{
    using (Mutex Mutex = new Mutex(false, "ApplicationSettingsMutex"))
    {
        String Result = "";

        Mutex.WaitOne();

        try
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(Key))
            {
                Result = (string)IsolatedStorageSettings.ApplicationSettings[Key];
            }
        }
        catch (Exception)
        {

        }
        finally
        {
            Mutex.ReleaseMutex();                
        }

        return Result;
    }
}

public static void SetApplicationSetting(string Key, string Value)
{
    using (Mutex Mutex = new Mutex(false, "ApplicationSettingsMutex"))
    {
        Mutex.WaitOne();

        try
        {
            IsolatedStorageSettings.ApplicationSettings[Key] = Value;
            IsolatedStorageSettings.ApplicationSettings.Save();
        }
        catch (Exception)
        {

        }
        finally
        {
            Mutex.ReleaseMutex();
        }
    }
}

我想在访问我的本地数据库时做类似的事情,但我无法弄清楚这样做的最佳方式。 Mutex究竟要保护什么?只写入db?

                    // Set AzurePk for the local Record
                using (var UpdateRecord = await db.PrepareStatementAsync("UPDATE Record SET AzurePk = ? WHERE Id = ?"))
                {
                    UpdateRecord.BindTextParameterAt(1, NewRecord.Id);
                    UpdateRecord.BindIntParameterAt(2, NewRecord.RecordId);

                    await UpdateRecord.StepAsync();
                }

这是我从计划任务更新SQLite数据库的一些示例代码,它很容易用Mutex包围该代码,但在前台应用程序中有很多不同的区域我正在查询数据库,它可能很快就会变得混乱。

我曾考虑制作本地.db文件的副本,然后我的后台任务只能在副本上工作,只有当我从中读取时才会工作,而不是我必须插入或更新。< / p>

有什么想法吗?感谢

1 个答案:

答案 0 :(得分:0)

所以这是我对情况的看法(信念)......因为我将从后台代理和前台应用程序访问sqlite数据存储区

  • http://www.sqlite.org/faq.html#q5 &#34; SQLite使用读/写锁来控制对数据库的访问。&#34;它说这与Windows系统不可靠,但我不确定这是否适用于WinRT

  • 如果指定选项SQLITE_OPEN_NOMUTEX,则以多线程模式http://www.sqlite.org/threadsafe.html打开连接。如果我理解正确,那么Sqlite在访问共享资源时会在内部使用Mutex。

第一点我不太信任,因为我不知道这个读写器锁在WinRT中的效果如何。从我在sqlite文档中可以看出,如果您在多线程模式下打开连接,那么您可以安全地从后台和前台访问数据库。通过内部Mutex来保护对共享资源的访问...如果您在多线程模式下打开数据库,还有其他事项需要注意...

例如:&#34;多线程。在这种模式下,只要在两个或多个线程中不同时使用单个数据库连接,SQLite就可以被多个线程安全地使用。 &#34;

我正在从IsolatedStorage转移到使用Akavache进行使用sqlite作为后端的所有内容,并以多线程模式打开sqlite连接 https://github.com/akavache/Akavache/blob/master/Akavache.Sqlite3/SQLiteAsync.cs