'SQLite.SQLiteConnection' 的类型初始值设定项抛出异常

The type initializer for 'SQLite.SQLiteConnection' threw an exception

我正在尝试实现 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);

错误:

The type initializer for 'SQLite.SQLiteConnection' threw an exception.

内部异常:

System.Exception: This is the 'bait'. You probably need to add one of the SQLitePCLRaw.bundle_* nuget packages to your platform project.
at SQLitePCL.Batteries_V2.Init () [0x00000] in <9baed10c674b49e0b16322f238b8ecc1>:0 at SQLite.SQLiteConnection..cctor () [0x00000] in /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>();
}

我在这上面花了几天时间并尝试了很多资源,例如:但最终没有成功。

不幸的是,像 "it just works"、"not sure what I did"、"clean/rebuild" 这样的废话是我见过的唯一答案,例如以前的 link,其他 SO 帖子,例如

这是我的 package.config Android 项目:

<?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>

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

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

Android

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;

希望对您有所帮助!

在我看来,您在 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" />
...

我不想让自己陷入困境 "I don't know how I fixed it",但事实就是如此。我开始清理并复制粘贴代码并取消 Nuget 包,一切正常。也许我最初忽略了一些东西,也许版本不匹配,我不能说。但是,我尝试添加 Trevor 提到的依赖项,但问题仍然存在,所以我认为我没有遗漏任何东西。

我遇到了同样的问题,删除 "bin" 和 "obj" 文件夹解决了问题。

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

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

在我的例子中,我遇到了错误,因为我在 Windows Forms 应用程序的 "bin" 文件夹中缺少 "runtimes" 文件夹。

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

  • runtimes\win-arm\native
  • runtimes\win-x64\native
  • runtimes\win-x86\native

在每个文件夹中,有一个 "e_sqlite3.dll" 文件。

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

我通过将 sql-net-pcl 库从 1.7.302-beta 降级到版本 1.6.292

解决了这个问题

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

我 运行 当我尝试使用 sqlite-net-pcl 为一个应用程序构建一个安装程序时,我 运行 进入了这个。 运行 当我从 VS 启动它时它很好,但安装的应用程序崩溃并出现此错误消息。

事实证明 Installer Projects 没有正确创建文件树。在应用程序文件夹中,您需要从您的 bin 文件夹中添加一个名为 运行times 的文件夹。

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

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