MvvmCross SQLite插件不适用于UWP项目

时间:2017-11-02 12:07:23

标签: c# sqlite xamarin uwp mvvmcross

当我尝试运行我的UWP项目时出现以下错误:

  

MvvmCross.Platform.Exceptions.MvxIoCResolveException:'失败   解析类型参数工厂的参数   创建时的IMvxSqliteConnectionFactory   DebtBuddy.Core.Repositories.AccountRepository'

我的android项目运行没有问题。以下是我的存储库类。

 public class AccountRepository : IAccountRepository
{
    private readonly SQLiteConnection _connection;

    public AccountRepository(IMvxSqliteConnectionFactory factory)
    {
        _connection = factory.GetConnection("Account.db");
        _connection.CreateTable<Account>();
    }

    public async Task<List<Account>> GetAllAccounts()
    {
        return await Task.FromResult(_connection.Table<Account>().ToList());
    }

    public async Task Insert(Account account)
    {
        await Task.Run(() => _connection.Insert(account));
    }

    public async void Update(Account account)
    {
        await Task.FromResult(_connection.Update(account));
    }

    public async void Delete(int id)
    {
        await Task.FromResult(_connection.Delete(id));
    }
}

2 个答案:

答案 0 :(得分:3)

你应该放弃使用它,因为不推荐使用MvvmCross SQLite插件。我还建议使用SQLiteAsyncConnection包装Task内的所有操作,类似于您在此处所做的操作。

目前首选的SQLite包名为sqlite-net-pcl,可在NuGetGitHub上使用。此版本的库支持Android Nougat及更高版本,并在最新版本中以.Net Standard为目标。

MvvmCross SQLite包装器只是SQLite的一个较小的包装器。您可以自己轻松地重现MvvmCross SQLite插件。这是一个这样的例子:

将此界面放入PCL / .Net Standard&#34; Core&#34;项目:

public interface ISqliteConnectionService
{
    SQLiteAsyncConnection GetAsyncConnection();
}

然后为每个平台实现接口。以下是Android的外观。对不起,我手头没有UWP示例。

public class AndroidSqliteConnectionService : ISqliteConnectionService
{
    private const string FileName = "File.sqlite3";
    private SQLiteAsyncConnection _connection;

    public SQLiteAsyncConnection GetAsyncConnection()
    {
        if (_connection == null)
        {
            var databaseFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
            var databaseFilePath = Path.Combine(databaseFolder, FileName);
            _connection = new SQLiteAsyncConnection(databaseFilePath);
        }
        return _connection;
    }
}

然后在每个平台的Setup.cs中注册实现:

protected override void InitializeFirstChance()
{
    Mvx.LazyConstructAndRegisterSingleton<ISqliteConnectionService, AndroidSqliteConnectionService>();
}

现在,您可以使用构造函数依赖注入与您的PCL / .Net Standard&#34; Core&#34;内的ViewModel,存储库等共享ISqliteConnectionService。项目

答案 1 :(得分:0)

您是否还记得将MvvmCross SQLite包添加到您的UWP项目中?由于这两个平台都支持该插件,因此最有可能的原因是您的项目失败并且正在另一个平台上工作。

另外,请注意MvvmCross SQLite插件是deprecated,应该避免使用。