2017-01-22 5 views
0

Ich habe vor kurzem meine beiden Projekte auf SQLite.net-pcl verschoben. Ich habe bis jetzt eine Reihe von Problemen erlebt und das ist meine letzte. Jedes Mal, wenn ich meine App auf iOS starte, stürzt es irgendwann ab und sagt SQLite.SQLiteException: Constraint. Android läuft auf der gleichen PCL und wird zum ersten Mal funktionieren, aber gibt mir danach SQLite.SQLiteException: Constraint, bis ich meinen Anwendungsspeicher löschen. Ich bin mir nicht sicher, was ich hier noch versuchen sollte.Xamarin - SQLite.SQLiteException: Einschränkung mit SQLite-net-pcl

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

Antwort

1

Okay, so ich einige Informationen über gefunden haben, warum dies geschah ...

So SQLiteException: Constraint wird, wenn Sie im Zusammenhang haben eine UNIQUE, NOT NULL oder Check Einschränkung auf einen Tisch und Sie versuchen, eine UPDATE zu tun oder INSERT. Hier lesen SQLite Contraints

Also mein Problem war, dass ich meine Primärschlüssel (die immer eindeutig sein wird), und inkorrekten Code, der ein Element in der Datenbank überprüft wurde, und es versuchte, es einzufügen . Da der Primärschlüssel derselbe ist, wurde ein Fehler ausgegeben. Dies wurde jetzt gelöst.