Xamarin, Android, PCL SQLLite, SQLite.NET snafu

Довольно сложно понять пакеты nuget для установки в решение Xamrin при поиске в Интернете, существуют десятки пакетов, десятки различных решений.

На данный момент у нашего решения есть 2 проекта: Android и PCL. Наша модель и доступ к данным определены в PCL. Реализация нашей платформы определена в Android.

Нам нужны SQLite, SQLite.Net (для аннотаций данных и табличных отношений) и SQLiteExtentions для * withchildren методов.

Мы застряли в старых версиях, потому что всякий раз, когда мы пытаемся что-либо обновить, наш хилый волшебный способ работы установленных пакетов просто разваливается. Нам нужно обновить или найти способ добавить SQLCipher в эту странную версию пакетов nuget.

У нас установлены текущие пакеты, которые работают:

Android проект

Проект PCL (определение модели и методы доступа к данным)

В настоящее время, если мы обновим 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.

Другие вопросы по тегам