Здравствуйте, я пытаюсь использовать SQLite в проекте Xamarin Forms. Но мне трудно заставить его работать. Я собираюсь предоставить информацию о конфигурации моего проекта:
- Версия Xamarin -> 4.6.0.726
- Стратегия совместного использования кода -> стандарт .NET
- sqlite-net-pcl 1.6.292
Проблема: при попытке установить соединение выдается следующее исключение -> {system.typeinitializationexception: инициализатор типа для sqlite.sqliteconnection выдал исключение. ---> system.dllnotfoundexception: e_sqlite3 at (оболочка, управляемая в собственный) sqlitepcl.sqlite3provider_e_sqlite3+nativemethods.sqlite3_libversion_number() at sqlitepcl.sqlite3provider_e_sqlite3.sqlitepcl.isqlite3provider.sqlite3_libversion_number () [0x00000] in :0 at sqlitepcl.raw. setprovider (sqlitepcl.isqlite3provider imp) [0x00008] in :0 at sqlitepcl.batteries_v2.init () [0x00005] in :0 at sqlite.sqliteconnection..cctor () [0x00016] in ‹84b9c9e630fa45bd8ac799333976ebbf>:0 --- конец внутренняя трассировка стека исключений --- в sqlite.sqliteconnectionwithlock..ctor (sqlite.sqliteconnectionstring строка соединения) [0x0000b] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 в sqlite.sqliteconnectionpool+entry.connect () [0x0001c] в ‹84b9c07ebb39fa493bd8ac .sqliteconnectionpool.getconnection (sqlite.sqliteconnectionstring строка соединения) [0x00048] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 в sqlite.sqliteasyncconnection.getconnection () [0x00005] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 :0 в sqlite.sqliteasyncconnection.get_tracer() [0x00000] в ‹84b9c9e630fa45bd8ac799333976ebbf>:0 }
Я провел интенсивное исследование и не нашел ничего подходящего для меня. Последнее сообщение, которое я посетил, было следующим: Android — инициализатор типа для SQLite.SQLiteConnection вызвал исключение. ---› System.DllNotFoundException: e_sqlite3 принятый ответ просто говорит, что установка самородка в проекте Android решит проблему (что я уже сделал)
Я покажу код и то, как выглядят мои самородки. Пакеты дроидов
<package id="sqlite-net-pcl" version="1.6.292" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.bundle_green" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.core" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.lib.e_sqlite3" version="2.0.1" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.14" targetFramework="monoandroid90" />
<package id="SQLitePCLRaw.provider.e_sqlite3" version="2.0.1" targetFramework="monoandroid90" />
Пакеты проектов с общим кодом
<package id="sqlite-net-pcl" version="1.6.292" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCLRaw.bundle_green" version="1.1.13" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCLRaw.core" version="1.1.13" targetFramework="portable45-net45+win8+wpa81" />
<package id="SQLitePCLRaw.lib.e_sqlite3.osx" version="1.1.14" targetFramework="portable45-net45+win8+wpa81" />
Интерфейс, используемый для получения пути
using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UISampleApp.Interfaces
{
public interface ISQLitePlatform
{
SQLiteConnection GetConnection();
SQLiteAsyncConnection GetConnectionAsync();
String GetPath();
}
}
Реализация дроидов
using System;
using System.IO;
using Android.OS;
using SQLite;
using SQLitePCL;
using UISampleApp.Interfaces;
using UISampleApp.Models;
[assembly: Xamarin.Forms.Dependency(typeof(UISampleApp.Droid.Implementations.SQLitePlatform))]
namespace UISampleApp.Droid.Implementations
{
public class SQLitePlatform : ISQLitePlatform
{
public string GetPath() {
var dbName =Constantes.DatabaseFileName;
var path = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal),dbName);
return path;
}
public SQLiteConnection GetConnection()
{
return new SQLiteConnection(GetPath());
}
public SQLiteAsyncConnection GetConnectionAsync()
{
return new SQLiteAsyncConnection(GetPath());
}
}
}
Код, генерирующий исключение
string path = DependencyService.Get<ISQLitePlatform>().GetPath();
SQLite.SQLiteAsyncConnection x = DependencyService.Get<ISQLitePlatform>().GetConnectionAsync();
try
{
await x.Table<TodoItem>().ToListAsync();
}
catch (Exception e)
{
throw e;
}
Я надеюсь, что кто-то может помочь мне, если потребуется дополнительная информация, просто скажите мне, и я предоставлю ее. PS: Делать то же самое в проекте со стратегией совместного использования кода PCL, но мне нужно, чтобы это работало в проекте со стандартом .NET в качестве стратегии совместного использования кода. Спасибо.
GitHub: https://github.com/jesse0099/Hackathon2019-Movil.git
x.CreateTableAsync<TodoItem>().Wait();
для создания таблицы передawait x.Table<TodoItem>().ToListAsync();
в оператореtry
. Он хорошо работает на моем ПК. Я не смог воспроизвести ошибку, не могли бы вы предоставить более подробную информацию? Вы загружаете образец кода, предоставленный Джейсоном, по ссылке: docs.microsoft.com/en-us/xamarin/get-started/quickstarts/ Выдает ли это такое же исключение? - person Wendy Zang - MSFT   schedule 13.05.2020