Xamarin,Android,PCL SQLLite,SQLite.NET 混乱

Xamarin, Android, PCL SQLLite, SQLite.NET snafu

在网上搜索时很难理解要在 Xamrin 解决方案中安装的 nuget 包,有几十个包,几十种不同的解决方案。

现在,我们的解决方案有 2 个项目,一个 Android 和一个 PCL。我们的模型和数据访问是在 PCL 中定义的。我们的平台实现定义在Android一个。

我们需要 SQLite,SQLite.Net(用于数据注释和 table 关系),以及用于 *withchildren 方法的 SQLiteExtentions。

我们被困在旧版本中,因为每当我们尝试更新任何东西时,我们安装的软件包协同工作的脆弱神奇方式就会分崩离析。我们确实需要升级或找到一种方法将 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 中的(简化)基础数据访问 class:

#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.net、SQLiteExtentions 和 SQLIte 密码的 SQLite? (pcl 中的数据访问和 android 项目中的连接实现?

对于任何想知道的人,我通过仅安装 SQLiteNetExtensions 并让它自己获得 SQLite 依赖项来解决它,代码影响最小,功能损失但不多。