“SQLite.SQLiteConnection”的类型初始化器抛出异常

Posted

技术标签:

【中文标题】“SQLite.SQLiteConnection”的类型初始化器抛出异常【英文标题】:The type initializer for 'SQLite.SQLiteConnection' threw an exception 【发布时间】:2018-04-05 12:56:08 【问题描述】:

我正在尝试实现 SQLite 的基本用法。我有一个Button 和一个EditText。我想存储EditTextOnClick 的内容。

我正在关注这个:https://developer.xamarin.com/guides/android/application_fundamentals/data/part_3_using_sqlite_orm/

和https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/databases/

如果没有收到后续错误,我无法通过以下起始代码:var db = new SQLiteConnection (dbPath);

错误:

内部异常:

System.Exception:这是“诱饵”。您可能需要添加其中之一 将 SQLitePCLRaw.bundle_* nuget 包添加到您的平台项目中。 在 SQLitePCL.Batteries_V2.Init () [0x00000] 中 :0 在 SQLite.SQLiteConnection..cctor () [0x00000] 在 /Users/vagrant/git/src/SQLite.cs:169

我已经在 PCL 和 Android 项目中安装了 NuGet 包。我看到安装了以下软件包:

SQLitePCLRaw.provider.e_sqlite3.android
SQLitePCLRaw.lib.e_sqlite3.android

我试过安装:

SQLitePCLRaw.bundle_e_sqlite3

如前所述,代码是可能的最基本实现:

try

    string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "TestDB-DEV.db3");

    var db = new SQLiteConnection(dbPath);
    db.CreateTable<PersonName>();

我为此花了几天时间并尝试了许多资源,例如:https://forums.xamarin.com/discussion/87289/sqlite-net-pcl-bait-issue,但最终没有成功。

不幸的是,诸如“它只是有效”、“不确定我做了什么”、“清理/重建”之类的废话是我见过的唯一答案,例如上一个链接,其他 SO 帖子,如 Xamarin SQLite "This is the 'bait'"

这是我的 Android 项目package.config

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="sqlite-net-pcl" version="1.4.118" targetFramework="monoandroid60" />
  <package id="SQLitePCLRaw.bundle_green" version="1.1.5" targetFramework="monoandroid60" />
  <package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="monoandroid60" />
  <package id="SQLitePCLRaw.lib.e_sqlite3.android" version="1.1.5" targetFramework="monoandroid60" />
  <package id="SQLitePCLRaw.provider.e_sqlite3.android" version="1.1.5" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.Design" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.v4" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.v7.AppCompat" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.v7.CardView" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.v7.MediaRouter" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.v7.RecyclerView" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Android.Support.Vector.Drawable" version="23.3.0" targetFramework="monoandroid60" />
  <package id="Xamarin.Forms" version="2.4.0.282" targetFramework="monoandroid60" />
</packages>

这是 PCL 项目的 package.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="sqlite-net-pcl" version="1.4.118" targetFramework="portable45-net45+win8+wpa81" />
  <package id="SQLitePCLRaw.bundle_green" version="1.1.5" targetFramework="portable45-net45+win8+wpa81" />
  <package id="SQLitePCLRaw.core" version="1.1.5" targetFramework="portable45-net45+win8+wpa81" />
  <package id="Xamarin.Forms" version="2.3.4.247" targetFramework="portable45-net45+win8+wpa81" />
</packages>

【问题讨论】:

如果您使用 XF,您应该遵循 XF 指南,而不是 Android 指南。见developer.xamarin.com/guides/xamarin-forms/… 我实际上是从那里开始的。那是我的第一个向导。我正在使用指南中显示的 NuGet 包。 我很惊讶我直到现在才注意到这一点,但是“monoandroid60”重要吗?我的设备是 API24,所以是“monoandroid70”。我想我会安装更新的 SDK 看看是否有帮助。 【参考方案1】:

我不想让自己陷入“我不知道我是怎么修好的”的,但这就是发生的事情。我开始清理并复制+粘贴代码并重新提取 Nuget 包,一切正常。也许我最初忽略了一些东西,也许版本不匹配,我不能说。但是,我尝试添加 Trevor 提到的依赖项,但问题仍然存在,所以我认为我没有遗漏任何东西。

【讨论】:

同样的……花了 1 小时……什么也没有 传递到 Visual Studio 2019 时遇到同样的问题。我更新了 nuget 包,一切都很好。 我在这里有一个合乎逻辑的答案:***.com/a/56636305/4404849 微软……黑猩猩为我们笨蛋写的 我必须说,我也正好在这里......我卸载了所有的 Nuget 包,清理了我的构建,并手动清理了文件夹中的所有临时文件,重新安装了 sqlite3,重新编译和宾果游戏。 (这是在一天采取“科学”方法并在逻辑上处理事情之后,遵循此处和其他地方的“明智”建议)......【参考方案2】:

我通过将 "sqlite-net-pcl" 包降级到最后一个稳定版本(v1.7.302-beta → v1.6.292)解决了同样的问题。

【讨论】:

我今天使用docs.microsoft.com/en-us/xamarin/android/data-cloud/data-access/… 的指南遇到了同样的问题,我回滚到最新的稳定版,它解决了我的问题【参考方案3】:

在我的情况下,我收到了错误,因为我的 Windows 窗体应用程序的“bin”文件夹中缺少“runtimes”文件夹。

在存储可执行文件的文件夹下面应该有一个像这样的子文件夹层次结构:

运行时\win-arm\native 运行时\win-x64\native 运行时\win-x86\native

在每个文件夹中,都有一个“e_sqlite3.dll”文件。

将这些添加到可执行文件所在的文件夹后,错误消失了。 实际上,如果您使用适当的 SQLite NuGet 包,文件会自动复制到输出文件夹。

【讨论】:

【参考方案4】:

我有同样的问题,删除“bin”和“obj”文件夹解决了。

【讨论】:

【参考方案5】:

设法解决它。问题是我在 2 个不同的项目中使用 Nuget 包,我只更新了其中一个。 使用 SQLite Nuget 和 Clean 相同版本的其他项目,Rebuild 解决了问题。

【讨论】:

微软..黑猩猩为我们笨蛋写的【参考方案6】:

我已经通过将 sql-net-pcl 库从 1.7.302-beta 降级到版本 1.6.292 解决了这个问题

【讨论】:

【参考方案7】:

我最终通过卸载 Microsoft.Data.Sqlite.Core 解决了这个问题。

【讨论】:

【参考方案8】:

在我看来,您在 PCL 和 Android 项目中仍然缺少一些依赖项。这是我在一个工作项目中的比较。

这是我在 PCL packages.config 中的内容:

...
<package id="sqlite-net-pcl" version="1.4.118" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCL.bundle_green" version="0.9.3" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCL.raw" version="0.9.3" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="portable45-net45+win8+wpa81" />
...

这是我在 Android packages.config 中的内容:

...
<package id="sqlite-net-pcl" version="1.4.118" targetFramework="monoandroid71" />
<package id="SQLitePCL.bundle_green" version="0.9.3" targetFramework="monoandroid71" />
<package id="SQLitePCL.plugin.sqlite3.android" version="0.9.3" targetFramework="monoandroid71" />
<package id="SQLitePCL.raw" version="0.9.3" targetFramework="monoandroid71" />
<package id="SQLitePCLRaw.bundle_green" version="1.1.8" targetFramework="monoandroid71" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="monoandroid71" />
<package id="SQLitePCLRaw.lib.e_sqlite3.android" version="1.1.8" targetFramework="monoandroid71" />
<package id="SQLitePCLRaw.provider.e_sqlite3.android" version="1.1.8" targetFramework="monoandroid71" />
...

【讨论】:

有趣,我将添加那些缺少的包并回来查看。【参考方案9】:

在所有项目(PCL、Android、ios)中安装以下一个包 虽然,它没有得到维护,但它对我有用。

然后编写以下平台特定代码以获取各个平台中的数据库连接:

安卓

public SQLiteConnection GetConnection()

     var dbName = "TestDB-DEV.db3";
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
     var path = Path.Combine(documentsPath, dbName);

     var platform = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
     var connection = new SQLiteConnection(platform, path);

     return connection;
 

iOS

public SQLiteConnection GetConnection()

    var dbName = "TestDB-DEV.db3";
    string folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string libraryPath = Path.Combine(folder, "..", "Library");
    var path = Path.Combine(libraryPath, dbName);
    var platform = new SQLite.Net.Platform.XamarinIOS.SQLitePlatformIOS();
    var connection = new SQLiteConnection(platform, path);

    return connection;

您将使用对 SQLite.Net 的引用,如下所示:

using SQLite.Net;

希望这会有所帮助!

【讨论】:

这直接违背了我读过的关于选择哪个 Nuget 包的所有建议。我见过的每个示例都使用 sqlite-net-pcl,而不是 SQLite.Net PCL。话虽如此,您的代码与 sqlite-net-pcl 不兼容。但是,如果没有更好的解决方案,我将测试完全卸载 sqlite-net-pcl 并安装 SQLite.Net PCL。【参考方案10】:

清理解决方案,然后重建。如果不起作用,请重新安装 sqlite nuget。如果仍然无法正常工作,请检查所有 nugets ef sqlite 等的版本(如果可以,请更新它们)

【讨论】:

【参考方案11】:

当我尝试使用 VS Installer Projects 为使用 sqlite-net-pcl 的应用程序构建安装程序时遇到了这个问题。当我从 VS 启动它时它运行良好,但安装的应用程序崩溃并显示此错误消息。

原来安装程序项目没有正确创建文件树。在 Application 文件夹中,您需要从 bin 文件夹中添加一个名为 runtimes 的文件夹。

现在,当您构建并运行安装程序时,sql-lite dll 将位于正确的位置,您将不会收到此错误。

【讨论】:

以上是关于“SQLite.SQLiteConnection”的类型初始化器抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

System.TypeInitializationException:''SQLite.SQLiteConnection'的类型初始值设定项引发了异常。'

我应该将啥传递给 SQLitePCL.raw.SetProvider() 以避免“'Microsoft.Data.Sqlite.SqliteConnection' 的类型初始化程序引发异常”

如果数据为空,如何阻止 sqlitedatareader 返回 0?

在C#上读取SQLite,第一个reader正常,第二个怎么都读不出来~~~求高手指点

Greendao SQLiteConstraintException: NOT NULL constraint failed

Greendao SQLiteConstraintException: NOT NULL constraint failed