将 SQLiteNetextensions 与 Xamarin 一起用于 Android-App

Use SQLiteNetextensions with Xamarin for Android-App

我已经阅读了一些关于 SQLite for Xamarin 的帖子,但我仍然无法以正确的方式设置 SQLiteNetExtensions。我目前正在使用 Target Framework Android 7.1(API Level 25 - Nougat)开发一个 android 应用程序。

谁能告诉我我做错了什么?

  1. 我安装了 nuget 包:

    Install-Package SQLiteNetExtensions -Version 2.0.0-alpha2 -Pre

    Install-Package SQLite.Net-PCL -Version 3.1.1

    根据:https://bitbucket.org/twincoders/sqlite-net-extensions

  2. 然后我设置我的代码。

    using SQLite.Net.Attributes;
    using SQLiteNetExtensions.Attributes;
    using System;
    
    namespace AppName.Resources.Model
    {
      public class Entry
      {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        [ForeignKey(typeof(Stock))]
        public int StockId { get; set; }
        public DateTime Date { get; set; }
        public double Amount { get; set; }
      }
    }
    


    using SQLite.Net.Attributes;
    using SQLiteNetExtensions.Attributes;
    using System;
    using System.Collections.Generic;
    
    namespace AppName.Resources.Model
    {
      public class Stock
      {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime LastUpdated { get; set; }
        [OneToMany(CascadeOperations = CascadeOperation.All)]
        public List<Entry> Entrys { get; set; }
      }
    }
    


    using Android.Util;
    using AppName.Resources.Model;
    using SQLite.Net;
    using SQLite.Net.Platform.XamarinAndroid;
    using SQLiteNetExtensions.Extensions;
    using System.Collections.Generic;
    using System.IO;
    
    namespace AppName.Resources.DataHelper
    {
      public class DataBase
      {
        string folder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
        public bool CreateDataBase()
        {
          try
          {
            using (var stocksDBConnection = new SQLiteConnection(new SQLitePlatformAndroid(), Path.Combine(folder, "Stock.db")))
            {
              stocksDBConnection.CreateTable<Entry>();
              stocksDBConnection.CreateTable<Stock>();    
              return true;
            }
          }
          catch (SQLiteException ex)
          {
            Log.Info("SQLiteEx", ex.Message);
            return false;
          }
        }
    
        public bool InsertIntoTableStock(object stock)
        {
          try
          {
            using (var stocksDBConnection = new SQLiteConnection(new SQLitePlatformAndroid(), Path.Combine(folder, "Stock.db")))
            {
              stocksDBConnection.InsertWithChildren(stock);
              return true;
            }
          }
          catch (SQLiteException ex)
          {
            Log.Info("SQLiteEx", ex.Message);
            return false;
          }
        }
        ...
    
  3. 这些引用是由 nuget 添加的:

    SQLite-net

    SQLite.Net

    SQLite.Net.Platform.XamarinAndroid

    SQLiteNetExtensions

    SQLitePCLRaw.Batteries_green

    SQLitePCLRaw.Core

    SQLitePCLRaw.lib.e_sqlite3

    SQLitePCLRaw.provider.e_sqlite3

  4. 发生错误:

    'SQLiteConnection' does not contain a definition for 'InsertWithChildren' and the best extension method overload 'WriteOperations.InsertWithChildren(SQLiteConnection, object, bool)' requires a receiver of type 'SQLiteConnection'

    'SQLiteConnection' does not contain a definition for 'GetAllWithChildren' and the best extension method overload 'ReadOperations.GetAllWithChildren(SQLiteConnection, Expression>, bool)' requires a receiver of type 'SQLiteConnection'

嗯,这就是我得到的程度。那里有人知道该怎么做吗?也许删除冲突的引用?

经过一些研究我发现:

Install-Package SQLiteNetExtensions -Version 2.0.0-alpha2 -Pre

取决于

Install-Package sqlite-net-pcl

而不是

Install-Package SQLite.Net-PCL -Version 3.1.1

但是在删除所有引用、清理解决方案并重新安装两个需要的包之后,SQLite.net 不再可用。 尝试使用 SQLite 时:

'SQLiteConnection' does not contain a definition for 'InsertWithChildren' and the best extension method overload 'WriteOperations.InsertWithChildren(SQLiteConnection, object, bool)' requires a receiver of type 'SQLiteConnection'

我很好奇是否有可能使用 VS 无缝开发 Android-Apps。因为一切都需要数年时间才能建立。


编辑:

好吧,在 a** 痛苦了几天之后,解决方案是使用更新的预发布版 (alpha3)官方页面。目前我很满意。 :)

Install-Package SQLiteNetExtensions-netstandard -Version 2.0.0-alpha3 -Pre

希望有人可能需要这个。

好的,经过一番搜索,我了解到这个扩展的创建者在开发它时使用了一种称为 MvvmCross 的模式。因此,除非您使用该模式模型,否则您将收到此错误。

对于非 MvvmCross 用户,他们必须重建源文件并在他们的项目中引用它,而不是使用您正在使用的预编译文件。

下面link转到第四个post https://forums.xamarin.com/discussion/20117/sqlite-net-extensions-and-sqliteconnection 在这里,他以非常简短的方式讲述了如何在 post 中从源代码重建。

希望您能理解它,但如果不能,请等到我安装 Visual Studio 和 Xamarin 并亲自试用,这样我才能为您提供准确的步骤。 到那时还需要一段时间,Kudos!

这里是 link 源文件 https://bitbucket.org/twincoders/sqlite-net-extensions/downloads/ 单击下载存储库

好的,我确定这只是一个版本问题,因为我刚刚尝试了您的代码,它对我来说工作正常。尝试从 Visual Studio 中的 NuGet 包管理器 window 安装 SQliteNetExtensions v 1.3.0 包,仅此而已。它将安装它的所有依赖项。

这是我所做的 - 尝试做同样的事情,看看是否有帮助:

  1. 我在 Visual Studio 中创建了一个新的 Android 单视图应用程序项目 (我正在使用 community 2017 - 但应该没关系)并创建
    Stock , EntryDatabase 类 并粘贴给定的
    代码分别。
  2. 我只安装了来自 NuGet 包管理器的 SQliteNetExtensions v 1.3.0 它安装了以下依赖项,我自己没有安装这些。
    SQLite.Net-PCL v3.0.5
    NewtonSoft.Json v6.0.8

这是我安装 SQliteNetExtensions v 1.3.0 包后得到的结果。

如您所见,它显示了 SQLite.Net-PCL v3.0.5v3.1.1 的更新,我也厌倦了更新后的版本,但它仍然可以正常工作,所以更新与否取决于您。

这里有点证明它工作正常。我还在模拟器上编译并 运行 应用程序,它运行良好。

我在完成大量更新后才解决了这个问题。遇到同样的问题。

  • 卸载所有 SQLite 插件。请参阅下面的附件 pic/link。
  • 重新安装 SQLiteNetExtensions,这也会安装所有依赖项,实际上是该列表中除 SQLite 之外的所有文件。Net-PCL。
  • SQLiteNetExtensions 安装 SQLite-net-pcl 但您还需要另一个,所以请安装 SQLite。Net-PCL。
  • 重新启动 Visual Studio 因为它并不总是拾取所有新安装的软件包,请重新打开您的解决方案。

这对我有用,希望它也能帮助这里的其他人。