Search code examples
androidxamarinsqlite-net-extensions

Use SQLiteNetextensions with Xamarin for Android-App


I've read some threads about SQLite for Xamarin but I'm still not able to set up SQLiteNetExtensions in a proper way. I'm currently developing an android app with Target Framework Android 7.1(API Level 25 - Nougat).

Can anybody tell me what I'm doing wrong?

  1. I installed nuget packages:

    Install-Package SQLiteNetExtensions -Version 2.0.0-alpha2 -Pre

    Install-Package SQLite.Net-PCL -Version 3.1.1

    According to: https://bitbucket.org/twincoders/sqlite-net-extensions

  2. Then I set up my code.

    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. These References were added by nuget:

    SQLite-net

    SQLite.Net

    SQLite.Net.Platform.XamarinAndroid

    SQLiteNetExtensions

    SQLitePCLRaw.Batteries_green

    SQLitePCLRaw.Core

    SQLitePCLRaw.lib.e_sqlite3

    SQLitePCLRaw.provider.e_sqlite3

  4. Occuring error:

    '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'

Well that's how far I get. Anybody out there who knows what to do? Maybe remove conflicting references?


Solution

  • After some research I found out that:

    Install-Package SQLiteNetExtensions -Version 2.0.0-alpha2 -Pre
    

    depends on

    Install-Package sqlite-net-pcl
    

    instead of

    Install-Package SQLite.Net-PCL -Version 3.1.1
    

    But after removing all references, cleaning the solution and reinstalling the two needed packages there is no SQLite.net available anymore. When trying to use SQLite instead:

    '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'

    I'm curious if it's even possible to develop Android-Apps with VS seamlessly. Since everything takes years to set up.


    EDIT:

    Well, after some days of pain in the a** the solution was to use the even newer pre release (alpha3) which wasn't even referenced to on the official pages. Currently I'm satisfied. :)

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

    Hope anybody may need this.