2017-01-22 11 views
0

Я недавно перевел оба моих проекта на SQLite.net-pcl. До сих пор я столкнулся с рядом проблем, и это мое последнее. Каждый раз, когда я запускаю свое приложение на iOS, он падает в какой-то момент и говорит SQLite.SQLiteException: Constraint. Android работает на одном PCL и будет работать в первый раз, но потом дает мне SQLite.SQLiteException: ограничение до тех пор, пока я не удалю хранилище приложений. Не уверен, что еще попробовать здесь.Xamarin - SQLite.SQLiteException: ограничение с использованием SQLite-net-pcl

Пример кода: -

Объект

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 = " "; 
    } 
} 
} 

Database

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); 
      } 
     } 
    } 

код для инициализации БД:

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); 
} 

Вот что мой проект в настоящее время ссылки: -

enter image description here

ответ

1

Хорошо, так я нашел некоторую информацию о том, почему это происходит ...

Так SQLiteException: Ограничение связано с вами, если есть UNIQUE, NOT NULL или ПРОВЕРКА ограничение на столе, и вы пытаетесь сделать UPDATE или INSERT. Подробнее здесь SQLite Contraints

Итак, моя проблема заключалась в том, что у меня есть основной ключ (который всегда будет уникальным) и неправильный код, проверяющий элемент в базе данных, и вместо его обновления он пытался вставить его , Из-за того, что первичный ключ был тем же самым, он выдавал ошибку. Это было решено.