【问题标题】:SQLite 3 for iOS with EF Core带有 EF Core 的适用于 iOS 的 SQLite 3
【发布时间】:2019-12-22 08:18:09
【问题描述】:

我目前正在使用 SQLite 数据库进行 Xamarin 项目。我们正在使用 ExecuteSqlCommand 创建视图,在其中一个视图中我需要使用 ROW_NUMBER,它仅在 SQLite3 中受支持。

这对于 UWP 和 Android 来说很好,因为“SQLitePCLRaw.bundle_green”NuGet 包(“Microsoft.EntityFrameworkCore.Sqlite”使用)支持 SQLite 3,但 iOS 不同,默认情况下不支持 SQLite3。

在“SQLitePCLRaw.bundle_green”的 NuGet 包中,它确实显示“此包的策略:iOS=system SQLite,其他=包含 e_sqlite3”。它还讨论了它如何在除 iOS 之外的所有设备上使用相同的配置,从而解释了为什么 iOS 是唯一存在此问题的平台。

我尝试为 SQLite 添加几个提供程序以使其支持更高版本,但没有任何成功。我认为必须有一些方法可以为 iOS 更改此设置,但搜索有关“iOS=system SQLite”的信息只会出现在 SQLite 主页和一堆不相关的页面上。

我可以将查询更改为不使用SQLite 3,但是在其他2个平台上支持SQLite3却因为iOS而无法使用它感觉很愚蠢。

是否有一些 NuGet 包可以添加到 iOS 项目中,以便我们可以使用 SQLite3 查询?

【问题讨论】:

  • 安装SQLitePCLRaw.bundle_e_sqlite3并调用SQLitePCL.Batteries_V2.Init();来初始化它(所有平台)
  • @SushiHangover 我已将捆绑包添加到 iOS 项目并将 init 更改为 Batteries_V2 而不仅仅是电池,但这会导致 JIT 错误,因为 iOS 仅 AOT。当它尝试在 EnsureCreated 中打开连接时发生。我认为这是因为它在打开连接时试图加载 DLL?我尝试手动添加每个 SQLitePCLRaw 包而不是包,但同样的问题。我还尝试添加 ios_unified 包并像说的那样调用 SetProvider 但没有运气。有什么想法吗?
  • 我知道 EFCore 在 iOS AOT 要求方面存在问题(是否已修复?),这只是我不在移动设备上使用它的原因之一。此外,我不知道 SQLitePCLXXX 包中的任何东西会发出会导致 iOS 故障的 IL。
  • @SushiHangover 不幸的是,看起来我们都掌握了 EFCore 的最新信息。必须去 EFCore 3,但由于 Xamarin,我们不能这样做。所以我想这意味着我们运气不好,无法在 iOS 上使用 SQLite3 功能?

标签: c# sqlite xamarin xamarin.ios entity-framework-core


【解决方案1】:

在您的 iOS AppDelegate 中:调用之前

Xamarin.Forms.Forms.Init();

您需要致电:

SQLitePCL.Batteries.Init();

另外,您需要在某处设置以下内容,它是一个属性,几乎可以在任何地方设置:

[assembly: Preserve(typeof(System.Linq.Queryable), AllMembers = true)]

而且您不能使用 DynamicProxy。所有这一切都是由于AOT,我不打算解释任何这些,都在其他答案中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多