我应该在 Xamarin.Forms 上使用哪些 SQLite (sqlite-net-pcl) 标志?

Posted

技术标签:

【中文标题】我应该在 Xamarin.Forms 上使用哪些 SQLite (sqlite-net-pcl) 标志?【英文标题】:Which SQLite (sqlite-net-pcl) flags should I use on Xamarin.Forms? 【发布时间】:2021-09-17 14:24:14 【问题描述】:

我应该在 SQLite 标志中使用 FullMutex 还是 NoMutex?他们的目的是什么?如果是,我应该使用哪个?

现在:我正在使用这些标志:

public static class SQLiteConstants

    public const SQLiteOpenFlags Flags =
        SQLiteOpenFlags.ReadWrite |
        SQLiteOpenFlags.SharedCache |
        SQLiteOpenFlags.Create |
        SQLiteOpenFlags.FullMutex;

    public static string GetDatabasePath
    
        get => Path.Combine(FileSystem.AppDataDirectory, "UserScores.db3");
    

【问题讨论】:

【参考方案1】:

    NoMutex 的意思是新的数据库连接将使用“多线程”线程模式。这意味着允许单独的线程同时使用 SQLite,只要每个线程使用不同的数据库连接。

    FullMutext 的意思是新的数据库连接将使用“序列化”线程模式。这意味着多个线程可以安全地尝试同时使用相同的数据库连接。 (互斥锁会阻止任何实际的并发,但在这种模式下尝试并没有什么坏处。) 所以,你可以根据自己的情况选择旗帜

【讨论】:

抱歉回复晚了,那么FullMutex在性能方面要好得多?因为如您所知,移动设备的资源有限 如果你没有互斥体并且两个线程使用相同的连接来更新同一个表,那么要么两者都可以工作,要么你的应用程序将失败,内存将被破坏。如果您使用默认的序列化(全互斥锁),那么两者都可以工作,并且不会产生如上所述的后果。

以上是关于我应该在 Xamarin.Forms 上使用哪些 SQLite (sqlite-net-pcl) 标志?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin.Forms 中访问每个平台中的公共下载文件夹

Xamarin.Forms:Forms.Context 已过时

无法滚动在移动设备上使用 Xamarin.Forms 创建的 xaml 页面

Xamarin.Forms 页面底部到顶部动画

Xamarin Forms MvvM框架之FreshMvvM翻译一

如何在 Xamarin.Forms 上调用 HTTP2