我最近将我的两个项目都移到了SQLite.net-pcl。到目前为止,我遇到了很多问题,这是我最新的问题。每次我在iOS上运行我的应用程序时,它都会在某些时候崩溃并说SQLite.SQLiteException:Constraint。 Android在同一个PCL上运行并且将在第一次工作但之后给我SQLite.SQLiteException:Constraint直到我删除我的应用程序存储。不知道还有什么可以尝试。
代码示例: -
对象
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 = " ";
}
}
}
数据库
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);
}
这是我的项目当前引用的内容: -
答案 0 :(得分:5)
好的,所以我找到了一些关于为什么会发生这种情况的信息......
所以SQLiteException:如果你在表上有 UNIQUE , NOT NULL 或 CHECK 约束,那么约束与你有关执行更新或插入。在这里阅读更多SQLite Contraints
所以我的问题是我有我的主键(它总是唯一的),以及检查数据库中的项目的错误代码,而不是更新它,它试图插入它。由于主键是相同的,它引发了错误。这已经解决了。
答案 1 :(得分:0)
首次运行Android程序时,没有数据库。因此,将创建一个空数据库,并使用objectId作为PrimaryKey插入数据库。第二次尝试使用相同的objectId键将条目插入数据库时会产生此异常。
解决方案是为objectId设置AutoIncrement属性:
[SQLite.PrimaryKey, SQLite.AutoIncrement, SQLite.Column("articleObjectId")]
public string objectId { get; set; }
或对要插入的条目的objectId键保持谨慎。您可以更新现有条目,但不能使用现有密钥插入新条目。