将SQLiteNetextensions与Xamarin一起用于Android-App

时间:2017-06-18 16:49:37

标签: android xamarin sqlite-net-extensions

我已经阅读了一些关于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的网

         

    SQLite.Net

         

    SQLite.Net.Platform.XamarinAndroid

         

    SQLiteNetExtensions

         

    SQLitePCLRaw.Batteries_green

         

    SQLitePCLRaw.Core

         

    SQLitePCLRaw.lib.e_sqlite3

         

    SQLitePCLRaw.provider.e_sqlite3

  4. 发生错误:

      

    'SQLiteConnection'不包含'InsertWithChildren'的定义,最好的扩展方法重载'WriteOperations.InsertWithChildren(SQLiteConnection,object,bool)'需要一个'SQLiteConnection'类型的接收器

         

    'SQLiteConnection'不包含'GetAllWithChildren'的定义,最好的扩展方法重载'ReadOperations.GetAllWithChildren(SQLiteConnection,Expression&gt;,bool)'需要一个'SQLiteConnection'类型的接收器

  5. 那就是我得到了多远。在那里谁知道该怎么办?也许删除冲突的引用?

4 个答案:

答案 0 :(得分:0)

经过一番研究后我发现:

var hasContent = ed.selection.getContent({format : 'text'}.length > 0);
if(!hasContent) return;

取决于

SPAN

而不是

Install-Package SQLiteNetExtensions -Version 2.0.0-alpha2 -Pre

但删除所有引用后,清理解决方案并重新安装需要的两个软件包,不再有Install-Package sqlite-net-pcl 可用。 尝试使用Install-Package SQLite.Net-PCL -Version 3.1.1 代替时:

  

'SQLiteConnection'不包含'InsertWithChildren'的定义,最好的扩展方法重载'WriteOperations.InsertWithChildren(SQLiteConnection,object,bool)'需要一个'SQLiteConnection'类型的接收器

我很好奇是否可以无缝地开发VS-Android-Apps。因为一切都需要数年才能完成。

编辑:

好吧,经过几天的痛苦之后,解决方案就是使用更新的预发布版本(alpha 3 ),这在官方网页上甚至没有引用。目前我很满意。 :)

SQLite.net

希望有人可能需要这个。

答案 1 :(得分:0)

在经过一番搜索之后,我开始知道这个扩展的创建者在开发时使用了一个名为MvvmCross的模式。因此,除非您使用该模式模型,否则您将收到此错误。

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

转到以下链接的第四篇文章 https://forums.xamarin.com/discussion/20117/sqlite-net-extensions-and-sqliteconnection他在这里讲述了如何以非常简短的方式从他的帖子中重建源头。

希望你能理解它但是如果不等到我安装Visual Studio和Xamarin并自己试一试,那么我可以给你准确的步骤。 到那时需要一段时间,Kudos!

以下是源文件https://bitbucket.org/twincoders/sqlite-net-extensions/downloads/的链接 单击下载存储库

答案 2 :(得分:0)

好的,我确定它只是一个版本问题,因为我只是尝试了你的代码,它对我来说很好。尝试从Visual Studio中的NuGet包管理器窗口安装SQliteNetExtensions v 1.3.0包,而不是其他任何内容。它将安装所有依赖项。

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

  1. 我在Visual Studio中创建了一个新的Android Single View App项目 (我使用2017年社区 - 但这无关紧要)并创建了 StockEntryDatabase等级并粘贴您的给定的 代码分别。
  2. 我只安装了NuGet Package Manager enter image description here中的SQliteNetExtensions v 1.3.0包 它随之安装了以下依赖项,我自己也没有安装它们 SQLite.Net-PCL v3.0.5
    NewtonSoft.Json v6.0.8
  3. 这是我在安装SQliteNetExtensions v 1.3.0包之后得到的内容。

    enter image description here

    正如您可以看到它显示SQLite.Net-PCL v3.0.5v3.1.1的更新时我对已更新的版本感到厌倦但仍然可以正常工作,因此您可以自行更新。

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

    enter image description here

答案 3 :(得分:0)

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

  • 卸载所有SQLite插件。见下面附带的图片/链接。
  • 重新安装SQLiteNetExtensions,这也会安装所有依赖项,实际上该列表中的所有文件除了SQLite.Net-PCL。
  • SQLiteNetExtensions安装SQLite-net-pcl但你也需要另一个,安装SQLite.Net-PCL。
  • 重新启动Visual Studio,因为它并不总是拾取所有新安装的软件包,而是重新打开您的解决方案。

这对我有用,所以希望它也会帮助其他人。

SQLite plugin list