' SQLite.SQLiteConnection'的类型初始值设定项抛出一个例外

时间:2017-10-24 16:17:00

标签: c# xamarin xamarin.android sqlite-net-pcl

我试图实现SQLite令人难以置信的基本用法。我有def get_success_url(self): return reverse("host:edit-study-offer-image", args=[self.kwargs['pk']) Button。我想存储EditText EditText的内容。

我跟着这个:https://developer.xamarin.com/guides/android/application_fundamentals/data/part_3_using_sqlite_orm/

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

我无法通过以下启动代码而不会收到后续错误:OnClick

错误:

  

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

内部例外:

  

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

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

var db = new SQLiteConnection (dbPath);

我已尝试安装:

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

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

SQLitePCLRaw.bundle_e_sqlite3

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

不幸的是,废话就像"它只是工作","不确定我做了什么","清理/重建"是我见过的唯一答案,例如上一个链接,其他SO帖子,如Xamarin SQLite "This is the 'bait'"

以下是Android项目的try { string dbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "TestDB-DEV.db3"); var db = new SQLiteConnection(dbPath); db.CreateTable<PersonName>(); }

package.config

这是PCL项目的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>

9 个答案:

答案 0 :(得分:6)

我讨厌把自己置于“我不知道我是如何修理它”的船上,但这就是发生的事情。我开始干净并复制+粘贴代码并取消Nuget包和一切正常工作。也许我最初忽略了一些东西,也许版本不匹配,我不能说。但是,我尝试添加Trevor提到的依赖项并且问题仍然存在,所以我认为我没有遗漏任何东西。

答案 1 :(得分:3)

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

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

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

<强>的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;

希望这有帮助!

答案 6 :(得分:0)

在我看来,你仍然缺少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" />
...

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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