System.DllNotFoundException: /system/lib/libsqlite.so- формы Xamarin - PullRequest
0 голосов
/ 28 августа 2018

Я столкнулся с проблемой SQLite в проекте xamarin форм. Однако SQLiteConnection Я пытаюсь создать экземпляр на платформе Android, получая исключение.

Библиотеки, использующие в проекте android & iOS

  • SQLite.Net-PCL 3.1.1
  • SQLite.Net.Core-PCL 3.1.1

целевые версии файла манифеста

<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="27" />

Файл AndroidSQLite.cs

using SQLite;
using SQLite.Net;
using System.IO;
namespace XamarinTestList.Droid.Implementations
{
public class AndroidSQLite : ISQLite
{
    public SQLiteConnection GetConnection()
    {
        string documentPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        var path = Path.Combine(documentPath, DatabaseHelper.DbFileName); //DbFileName="Contacts.db"
        var plat = new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid();
        string dpPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "user.db3");
        var conn= new SQLiteConnection(plat, dpPath);
        return conn;
    }
}
}

Получение исключения на

 var conn= new SQLiteConnection(plat, dpPath);

Я установил вышеупомянутые библиотеки на уровне решения, но в общем проекте нет возможности установить пакеты Nuget. Снимок экрана общего проекта

enter image description here

После этой статьи выучите SQLite с помощью xamarin. xamarin forms-mvvm-sqlite-sample .

Полное исключение ниже

{System.DllNotFoundException: /system/lib/libsqlite.so at (обертка удалось к родной) SQLite.Net.Platform.XamarinAndroid.SQLiteApiAndroidInternal.sqlite3_open_v2 (байт [], IntPtr &, Int, IntPtr) на SQLite.Net.Platform.XamarinAndroid.SQLiteApiAndroid.Open (Имя файла System.Byte [], SQLite.Net.Interop.IDbHandle & db, System.Int32 flags, System.IntPtr zvfs) [0x00000] в <8dbf6ff85082469fb9d4dfaa9eae6b69>: 0 в SQLite.Net.SQLiteConnection..ctor (SQLite.Net.Interop.ISQLitePlatform sqlitePlatform, System.String databasePath, SQLite.Net.Interop.SQLiteOpenFlags openFlags, System.Boolean storeDateTimeAsTicks, сериализатор SQLite.Net.IBlobSerializer, System.Collections.Generic.IDictionary 2[TKey,TValue] tableMappings, System.Collections.Generic.IDictionary 2 [TKey, TValue] extraTypeMappings, преобразователь SQLite.Net.IContractResolver) [0x000a2] в <8f2bb39aeff94a30a8628064be9c7efe>: 0 в SQLite.Net.SQLiteConnection..ctor (SQLite.Net.Interop.ISQLitePlatform sqlitePlatform, System.String databasePath, System.Boolean storeDateTimeAsTicks, сериализатор SQLite.Net.IBlobSerializer, System.Collections.Generic.IDictionary 2[TKey,TValue] tableMappings, System.Collections.Generic.IDictionary 2 [TKey, TValue] extraTypeMappings, преобразователь SQLite.Net.IContractResolver) [0x00000] в <8f2bb39aeff94a30a8628064be9c7efe>: 0

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Используемый вами nuget SQLite.Net-PCL больше не поддерживается его автором. Вам необходимо переключиться на другой аналогичный пакет sqlite-net-pcl

Сначала удалите существующий SQLite.Net-PCL nuget из всех проектов и установите тот, который я упоминал выше. Удалить все старые ссылки SQLite, связанные со всеми файлами.

Необходимо внести некоторые изменения в SQLite классы обслуживания зависимостей, связанных с подключением. Затем вы можете настроить другой код, который относится к SQLite. Разрешите ссылки, добавив соответствующие операторы using для нового пакета nuget.

Я получил ту же ошибку и решил ее, переключившись на вышеуказанный пакет nuget.

ПРИМЕЧАНИЕ : В новом пакете nuget еще нет метода InsertOrReplaceAll. Так что, если вы использовали этот метод из предыдущего nuget, то для нового nuget необходимо создать метод расширения InsertOrReplaceAll .

РЕДАКТИРОВАТЬ : Чтобы получить соединение SQLite:

public SQLiteConnection GetConnection()
{
    return new SQLiteConnection(dpPath, false);
}

Нет необходимости проходить платформу в этом новом nuget. Передайте false, если вы не хотите хранить DateTime как Ticks.

0 голосов
/ 30 сентября 2018

2 варианта

  1. Изменить targetSdkVersion <24, поскольку в Android 7 приложение не может получить доступ к системным частным библиотекам. </li>
  2. Добавьте libsqlite.so в свою собственную папку lib.
0 голосов
/ 29 сентября 2018

Немного поздно, но для тех, кто сталкивается с той же проблемой, вам просто нужно добавить строку ниже в вашем родном коде

[assembly: Xamarin.Forms.Dependency(typeof(AndroidSQLite))]

Если это не сработает, удалите существующий sqlite-net-pcl и установите sqlite-net-pcl эту библиотеку и повторите попытку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...