web-dev-qa-db-ja.com

'SQLite.SQLiteConnection'のタイプ初期化子が例外をスローしました

SQLiteの信じられないほど基本的な使い方を実装しようとしています。 ButtonEditTextがあります。 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);

エラー:

'SQLite.SQLiteConnection'のタイプ初期化子が例外をスローしました。

内部例外:

System.Exception:これは「餌」です。おそらく、SQLitePCLRaw.bundle_ * nugetパッケージの1つをプラットフォームプロジェクトに追加する必要があります。
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>();
}

私はこれに数日間費やして、次のような多数のリソースを試しました: https://forums.xamarin.com/discussion/87289/sqlite-net-pcl-bait-issue しかし、最終的には成功しません。

残念ながら、「うまくいく」、「何をしたかわからない」、「クリーン/リビルド」などのナンセンスは、私が目にした唯一の答えです。前のリンク、その他SO Xamarin SQLite "This is the 'bait'"のような投稿

これが私の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>
9
Jacob Barnes

「どうやって直したかわからない」という船に乗るのは嫌いですが、それが起こったのです。私はクリーンに開始し、コードをコピーして貼り付け、Nugetパッケージを再プルし、すべてがうまくいきました。たぶん、最初は見落としていたかもしれませんし、バージョンの不一致があったかもしれません。ただし、Trevorによって言及された依存関係を追加しようとしたところ、問題はまだ存在していたため、何も不足していなかったとは思いません。

8
Jacob Barnes

"sqlite-net-pcl"パッケージを最新の安定バージョン(v1.7.302-beta→v1.6.292)にダウングレードして、同じ問題を修正しました。

5
Alexander S.

同じ問題がありました。「bin」フォルダと「obj」フォルダを削除すると解決しました。

2
Yacov

私の場合、Windowsフォームアプリケーションの "bin"フォルダーに "runtimes"フォルダーがないため、エラーが発生しました。

実行可能ファイルが格納されているフォルダの下に、次のような子フォルダ階層があります。

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

各フォルダには、「e_sqlite3.dll」ファイルがあります。

それらを実行可能ファイルが置かれているフォルダーに追加した後、エラーはなくなりました。実際、適切なSQLite NuGetパッケージを使用すると、ファイルは出力フォルダーに自動的にコピーされます。

2
Uwe Keim

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" />
...
0
Trevor Balcom

それを解決するために管理しました。問題は、2つの異なるプロジェクトでNugetパッケージを使用していて、そのうちの1つだけを更新したことです。 Alighting other project with same version of SQLite Nuget and Clean、Rebuildは問題を解決しました。

すべてのプロジェクト(PCL、Android、iOS)に次の1つのパッケージをインストールします。ただし、メンテナンスはされていませんが、私にとってはうまくいきます。

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;

お役に立てれば!

0
MilanG

ソリューションをクリーンにしてから再構築します。機能しない場合は、sqlite nugetを再インストールします。それでも機能しない場合は、すべてのnugets ef sqliteなどのバージョンを確認してください(可能な場合は更新してください)。

0
Gezero

Sql-net-pclライブラリを1.7.302-betaからバージョン1.6.292にダウングレードすることで問題を解決しました

0
Malik Haseeb