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

Jac*_*nes 4 c# xamarin.android xamarin sqlite-net-pcl

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

我正在关注: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);

错误:

“ SQLite.SQLiteConnection”的类型初始值设定项引发了异常。

内部异常:

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

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

SQLitePCLRaw.provider.e_sqlite3.android
SQLitePCLRaw.lib.e_sqlite3.android
Run Code Online (Sandbox Code Playgroud)

我试过安装:

SQLitePCLRaw.bundle_e_sqlite3
Run Code Online (Sandbox Code Playgroud)

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

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

    var db = new SQLiteConnection(dbPath);
    db.CreateTable<PersonName>();
}
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,我所见过的唯一答案就是胡说八道,例如“它能正常工作”,“不确定我做了什么”,“清理/重建”,例如以前的链接,其他诸如Xamarin SQLite之类的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>
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

Big*_*oul 28

好吧,自从你们问这个问题以来已经快五年了,似乎没有人知道如何解决这个问题。我对此进行了调查并发现了两种解决方法。值得一提的是,我正在使用.NET MAUI应用程序和Visual Studio Community 2022

  1. 首先,使用 NuGet 包:如果在 Visual Studio 中安装该sqlite-net-pclInstall-Package sqlite-net-pcl -Version 1.8.116,它将使用SQLitePCLRaw.bundle_green版本2.0.4. 使用将该软件包更新到最新版本(2.1.2截至撰写本文时)Install-Package SQLitePCLRaw.bundle_green。此过程将卸载以前的版本。现在,保存解决方案并关闭 Visual Studio。转到项目的文件夹并删除文件夹binobj. 重新打开 Visual Studio,恢复 NuGet 包,构建并运行。
  2. 其次,如果上述方法不起作用,请卸载软件包sqlite-net-pcl,克隆sqlite-net-pclGitHub 存储库(https://github.com/praeclarum/sqlite-net),打开您的项目,然后添加对该项目的引用SQLite-net-base。接下来,您必须使用类初始化提供程序rawSQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());。您必须在初始化目标平台的类中执行此操作。例如,Android定义一个MainApplication继承该类的a Microsoft.Maui.MauiApplication。在该类中,像这样MainApplication修改方法:CreateMauiApp()
using Android.App;
using Android.Runtime;

[Application]
public class MainApplication : MauiApplication
{
    public MainApplication(IntPtr handle, JniHandleOwnership ownership)
        : base(handle, ownership)
    {
    }

    protected override MauiApp CreateMauiApp()
    {
        SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
        return MauiProgram.CreateMauiApp();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还使用iOSMacCatalyst(macOS) 应用程序,请AppDelegate像这样修改该类:

为了iOS

using Foundation;

[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
    protected override MauiApp CreateMauiApp()
    {
        SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
        return MauiProgram.CreateMauiApp();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了MacCatalyst

using Foundation;

[Register("AppDelegate")]
public class AppDelegate : MauiUIApplicationDelegate
{
    protected override MauiApp CreateMauiApp()
    {
        SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3());
        return MauiProgram.CreateMauiApp();
    }
}
Run Code Online (Sandbox Code Playgroud)

不要忘记始终删除binobj文件夹。

我希望这个帮助能祝你好运!

  • 只需添加 SQLitePCLRaw.bundle_green (完全丢失)就可以修复它(Mac 上的 VS2022CE 预览版)。谢谢 (2认同)
  • 添加 SQLitePCLRaw.bundle_green 也对我有用。谢谢 (2认同)

Ale*_* S. 8

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

  • 我今天使用 https://learn.microsoft.com/en-us/xamarin/android/data-cloud/data-access/using-sqlite-orm 上的指南遇到了同样的问题,我回滚到最新的稳定版本并修复了我的问题 (2认同)

Jac*_*nes 6

我讨厌把自己放在“我不知道如何修理它”的船上,但这就是发生的事情。我开始清理并复制并粘贴了代码,并重新拖动了Nuget包,一切正常。也许我一开始就忽略了某些内容,或者版本不匹配,我不能说。但是,我尝试添加Trevor提到的依赖项,但问题仍然存在,因此我认为我没有丢失任何东西。


Uwe*_*eim 5

就我而言,我收到了错误,因为我缺少 Windows 窗体应用程序的“bin”文件夹中的“runtime”文件夹。

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

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

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

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