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パッケージの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>
「どうやって直したかわからない」という船に乗るのは嫌いですが、それが起こったのです。私はクリーンに開始し、コードをコピーして貼り付け、Nugetパッケージを再プルし、すべてがうまくいきました。たぶん、最初は見落としていたかもしれませんし、バージョンの不一致があったかもしれません。ただし、Trevorによって言及された依存関係を追加しようとしたところ、問題はまだ存在していたため、何も不足していなかったとは思いません。
"sqlite-net-pcl"パッケージを最新の安定バージョン(v1.7.302-beta→v1.6.292)にダウングレードして、同じ問題を修正しました。
同じ問題がありました。「bin」フォルダと「obj」フォルダを削除すると解決しました。
私の場合、Windowsフォームアプリケーションの "bin"フォルダーに "runtimes"フォルダーがないため、エラーが発生しました。
実行可能ファイルが格納されているフォルダの下に、次のような子フォルダ階層があります。
各フォルダには、「e_sqlite3.dll」ファイルがあります。
それらを実行可能ファイルが置かれているフォルダーに追加した後、エラーはなくなりました。実際、適切なSQLite NuGetパッケージを使用すると、ファイルは出力フォルダーに自動的にコピーされます。
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" />
...
それを解決するために管理しました。問題は、2つの異なるプロジェクトでNugetパッケージを使用していて、そのうちの1つだけを更新したことです。 Alighting other project with same version of SQLite Nuget and Clean、Rebuildは問題を解決しました。
すべてのプロジェクト(PCL、Android、iOS)に次の1つのパッケージをインストールします。ただし、メンテナンスはされていませんが、私にとってはうまくいきます。
次に、次のプラットフォーム固有のコードを記述して、それぞれのプラットフォームでデータベース接続を取得します。
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;
お役に立てれば!
ソリューションをクリーンにしてから再構築します。機能しない場合は、sqlite nugetを再インストールします。それでも機能しない場合は、すべてのnugets ef sqliteなどのバージョンを確認してください(可能な場合は更新してください)。
Sql-net-pclライブラリを1.7.302-betaからバージョン1.6.292にダウングレードすることで問題を解決しました