2017-01-21 3 views
0

SQLite-net-PCL scheint auf allen Plattformen außer Android 7.0 zu funktionieren.SQLite-net-pcl funktioniert nicht ordnungsgemäß auf Android 7.0 (Xamarin)

Bisher auf Android 7.0 von einer Neuinstallation wird die Anwendung aufgrund einer SQLException mit dem Problem abstürzen, dass es keine PK erstellen kann. Wenn ich den Anwendungsspeicher Ie. Wische die App von den Anwendungseinstellungen ab, dann funktioniert die App einwandfrei.

Alle anderen Plattformen scheinen sofort zu installieren. Sehen Sie selbst https://play.google.com/store/apps/details?id=com.purewowstudio.fivestartips

Ich kann nicht scheinen, das zu beheben. Am schlimmsten ist, dass mein iOS, das einen DB PCL teilt, überhaupt nicht lädt.

Kann jemand das beheben?

Code-Beispiel: -

Objekt

using System; 

namespace App.LocalObjects 
{ 
[Preserve(AllMembers = true)] 
public class LocalArticle 
{ 

    [SQLite.PrimaryKey, SQLite.Column("articleObjectId")] 
    public string objectId { get; set; } 
    public DateTime createdAt { get; set; } 
    public DateTime updatedAt { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Url { get; set; } 
    public int Status { get; set; } 

    public LocalArticle() 
    { 
     this.objectId = " "; 
     this.Title = " "; 
     this.Description = " "; 
     this.Url = " "; 
    } 
} 
} 

Datenbank

using System; 
using System.Linq; 
using System.Collections.Generic; 
using SQLite; 
using App.LocalObjects; 

namespace App.DataLayer 
{ 

public class Database 
{ 
    static object locker = new object(); 
    public SQLiteConnection database; 
    public string path; 

    public Database(SQLiteConnection conn) 
    { 
     database = conn; 
     database.CreateTable<LocalArticle>(); 
    } 

public int SaveLocalArticleItem(LocalArticle item) 
    { 
     lock (locker) 
     { 

      LocalArticle article = database.Table<LocalArticle>().FirstOrDefault(x => x.objectId == item.objectId); 

      if (article != null && article.objectId.Equals(item.objectId) && !article.updatedAt.Equals(item.updatedAt)) 
      { 
       database.Update(item); 

       return item.ID; 
      } else { 
       return database.Insert(item); 
      } 
     } 
    } 

-Code zu initialisieren DB:

using System; 
using System.IO; 
using Android.App; 
using App.BusinessLayer.Managers; 
using App.BusinessLayer.ParseObjects; 
using App.Utils; 
using Android.Content; 
using Com.Nostra13.Universalimageloader.Core; 
using Com.Nostra13.Universalimageloader.Core.Assist; 
using Android.Graphics; 
using Com.Nostra13.Universalimageloader.Cache.Memory.Impl; 
using Com.OneSignal; 
using Parse; 
using SQLite; 

namespace App.Droid 
{ 
[Application(LargeHeap = true)] 
public class App : Application 
{ 

    public static App Current { get; private set; } 
    public ModelManager modelManager { get; set; } 
    private SQLiteConnection conn; 
    private ImageLoader imageLoader; 

public App(IntPtr handle, global::Android.Runtime.JniHandleOwnership transfer) 
     : base(handle, transfer) 
    { 
     Current = this; 
    } 

public override void OnCreate() 
    { 
     base.OnCreate(); 

     SetupParse(); 
     SetupDB(); 
} 

private void SetupParse() 
    { 
     ParseObject.RegisterSubclass<ParseArticle>(); 

     ParseClient.Initialize(new ParseClient.Configuration 
     { 
      ApplicationId = Constants.ParseApplicationID, 
      Server = Constants.ParseServer 
     }); 


    } 

    private void SetupDB() 
    { 

     var sqliteFilename = Constants.DBName; 
     string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 
     var path = System.IO.Path.Combine(libraryPath, sqliteFilename); 
     conn = new SQLiteConnection(path); 

     modelManager = new ModelManager(conn); 
} 

Hier ist, was mein Projekt zur Zeit verweist: -

enter image description here

+0

Versuchen Sie, den Primärschlüssel 'objectId' in ein' int' zu ändern und fügen Sie dann auch die Annotation 'SQLite.AutoIncrement' hinzu. – hvaughan3

+0

Hey @ hvaughan3. Ich habe es geschafft, mein Problem zu beheben. Nicht sicher wie überhaupt, aber scheint jetzt zu arbeiten. Ich schaffte es, von diesem Problem zu einem anderen überzugehen, das gerade gelöst wurde. –

+0

Schön! Checke deinen Code ein und berühre ihn dann nicht mehr, damit er nicht wieder bricht;) – hvaughan3

Antwort

0

Android N tatsächlich Regeln begann Durchsetzung rund um die SQLite-Bibliotheken zugreifen, die mit Android kommen. Daher hat jede App (oder App-Bibliothek), die zuvor direkt auf SQLite zugegriffen hat, ohne den speziellen Java-Wrapper durchlaufen zu haben, bereits technisch die Regeln durchbrochen, weil Android diese Regeln nie wirklich durchgesetzt hat. Lesen Sie mehr darüber here

Nun, da Android N diese Regeln erzwingt, verursacht es den Absturz auftreten. Ich vermute, dass Sie die SQLite.Net-PCL-Bibliothek für den Zugriff auf Ihre SQLite DB verwenden. Wenn Sie here betrachten, gibt es ein offenes Problem für genau dieses Problem, das die Bibliotheksersteller nie behoben haben.

Wir sind auf das gleiche Problem gestoßen und haben seitdem in die SQLite-Net-PCL-Bibliothek gewechselt (beachten Sie den Bindestrich anstelle des Punktes), der genauso funktioniert und eine fast identische API hat. Ein Link für diese Bibliothek kann here gefunden werden.

+0

Hi, ja ich bin auch in diese Bibliothek umgezogen. Das ist was die Probleme verursacht. Ich habe SQLite.Net ausgeführt und es funktioniert, aber auf Android N erschien immer wieder ein Popup, das über sqlite.so sprach. Ich habe dann zu SQLite-net-plc gewechselt und dies hat nun sowohl mein Android- als auch mein iOS-Projekt gekillt. Es scheint seltsam, dass alle anderen ihre Arbeit haben. Ich bin verwirrt, ob ich etwas vermisse. Ich habe ungefähr 1 Tage damit zugebracht, das Problem zu beheben, bin aber jetzt festgefahren. –

+0

@PhillWiggins Dann müssen wir tatsächlichen Code sehen, um etwas über das Problem zu wissen. – hvaughan3

+0

Danke @ hvaughan3 Ich habe meine Objektklasse und meine Datenbankklasse hinzugefügt, die für die Erstellung der Tabellen verwendet wurde. –

Verwandte Themen