Xamarin, Android, PCL SQLLite, SQLite.NET snafu
Довольно сложно понять пакеты nuget для установки в решение Xamrin при поиске в Интернете, существуют десятки пакетов, десятки различных решений.
На данный момент у нашего решения есть 2 проекта: Android и PCL. Наша модель и доступ к данным определены в PCL. Реализация нашей платформы определена в Android.
Нам нужны SQLite, SQLite.Net (для аннотаций данных и табличных отношений) и SQLiteExtentions для * withchildren методов.
Мы застряли в старых версиях, потому что всякий раз, когда мы пытаемся что-либо обновить, наш хилый волшебный способ работы установленных пакетов просто разваливается. Нам нужно обновить или найти способ добавить SQLCipher в эту странную версию пакетов nuget.
У нас установлены текущие пакеты, которые работают:
Android проект
- Mono.Data.Sqlite.Portable 1.0.3.5 (не знаю, почему...)
- SQLite.Net.Core-PCL 3.1.1
- https://www.nuget.org/packages/SQLite.Net.Platform.XamarinAndroidN
- SQLite.Net-PCL 3.1.1
- SQLiteNetExtensions 1.3.0 (требуется для GetWithChildren и т. Д.)
- SQLitePCL.raw 0.9.3
Проект PCL (определение модели и методы доступа к данным)
- Mono.Data.Sqlite.Portable 1.0.3.5 (не знаю, почему...)
- SQLite.Net.Core-PCL 3.1.1
- https://www.nuget.org/packages/SQLite.Net.Platform.XamarinAndroidN
- SQLite.Net-PCL 3.1.1
- SQLiteNetExtensions 1.3.0 (требуется для GetWithChildren и т. Д.)
- SQLitePCL.raw 0.9.3
В настоящее время, если мы обновим SQLiteExtensions до версии 2.0, будет установлена куча других пакетов SQLite nuget, что нарушит хрупкую стабильность нашего кода доступа к данным (происходит сбой в методах * WithChildren с:
Severity Code Description Project File Line Suppression State
Error CS1929 'SQLiteConnection' does not contain a definition for
'GetWithChildren' and the best extension method overload
'ReadOperations.GetWithChildren<TEntity>(SQLiteConnection, object, bool)'
requires a receiver of type 'SQLiteConnection'
Мы также должны были бы включить SQLiteCipher, и никакие комбинации пакетов не могут быть созданы для работы с нашим решением.
Наша реализация для платформы Android:
#region Usings
using OURPCLLib.DataAccess;
using Serilog;
using SQLite.Net;
using SQLite.Net.Interop;
using SQLite.Net.Platform.XamarinAndroid;
using System;
using System.IO;
#endregion Usings
public class AndroidSQLiteDatabase : SQLiteDatabaseAccess
{
protected ISQLitePlatform SQLitePlatform
{
get { return new SQLitePlatformAndroidN(); }
}
protected override SQLiteConnection GetConnection()
{
var conn = new SQLiteConnection(
SQLitePlatform,
"dbpathforus.sqlite",
SQLiteOpenFlags.ReadWrite |
SQLiteOpenFlags.FullMutex |
SQLiteOpenFlags.ProtectionCompleteUnlessOpen |
SQLiteOpenFlags.Create |
SQLiteOpenFlags.SharedCache);
return conn;
}
}
(Упрощенный) базовый класс доступа к данным в PCL:
#region Usings
using OURPCLLib.DataAccess.Entities;
using SQLite.Net;
using SQLite.Net.Attributes;
using SQLite.Net.Interop;
using SQLiteNetExtensions.Extensions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
#endregion Usings
public abstract class SQLiteDatabaseAccess
{
protected abstract SQLiteConnection GetConnection();
// Example of one of the many methods accessing the DB using SQLite.Net
public bool Any<TEntity>(Expression<Func<TEntity, bool>> expression)
where TEntity : class, IBaseEntity, new()
{
using (var currentConnection = this.GetConnection())
{
return currentConnection.Table<TEntity>().Where(expression).FirstOrDefault() != null;
}
}
// Example of one of the methods accessing the DB using SQLiteExtentions
public TEntity GetWithChildren<TEntity>(int id, bool recursive = false)
where TEntity : class, IBaseEntity, new()
{
using (var currentConnection = this.GetConnection())
{
return currentConnection.GetWithChildren<TEntity>(id, recursive);
}
}
}
Кто-нибудь может помочь нам в том, как использовать SQLite с SQLIte.net, SQLiteExtentions и шифром SQLIte в проекте, подобном нашему? (доступ к данным в pcl и реализация соединения в проекте Android?
1 ответ
Для тех, кто интересуется, я решил эту проблему с минимальным воздействием на код и некоторой потерей функциональности, но ненамного, просто установив SQLiteNetExtensions и позволив ему получить свою зависимость от SQLite.