【问题标题】:Xamarin - SQLite.SQLiteException: Constraint using SQLite-net-pclXamarin - SQLite.SQLiteException:使用 SQLite-net-pcl 的约束
【发布时间】:2017-01-22 17:00:57
【问题描述】:

我最近将我的两个项目都转移到了 SQLite.net-pcl。到目前为止,我遇到了许多问题,这是我最新的问题。每次我在 iOS 上运行我的应用程序时,它都会在某个时候崩溃并显示 SQLite.SQLiteException:约束。 Android 在同一个 PCL 上运行,并且第一次可以工作,但后来给了我 SQLite.SQLiteException: 约束,直到我删除我的应用程序存储。不知道还能在这里尝试什么。

代码示例:-

对象

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

这是我的项目当前引用的内容:-

【问题讨论】:

    标签: sql xamarin sqlite-net


    【解决方案1】:

    好的,所以我找到了一些关于为什么会发生这种情况的信息......

    So SQLiteException: Constraint is related to if you have a UNIQUE, NOT NULL, or CHECK constraint on a table and you try to执行 UPDATEINSERT。在此处阅读更多信息SQLite Contraints

    所以我的问题是我有我的主键(这将始终是唯一的),以及检查数据库中项目的错误代码,而不是更新它,它试图插入它。由于主键相同,因此引发错误。现在已经解决了。

    【讨论】:

      【解决方案2】:

      第一次运行 Android 程序时,没有数据库。因此,创建了一个空数据库,并且以 objectId 作为 PrimaryKey 的 INSERT 到数据库工作正常。第二次尝试将具有相同 objectId 键的条目插入数据库会产生此异常。

      解决方案是为 objectId 设置 AutoIncrement 属性:

      [SQLite.PrimaryKey, SQLite.AutoIncrement, SQLite.Column("articleObjectId")]
      public string objectId { get; set; }
      

      或者要注意要插入的条目的 objectId 键。您可以更新现有条目,但不能使用现有密钥插入新条目。

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2017-07-02
        • 2018-07-06
        • 1970-01-01
        相关资源
        最近更新 更多