2

又是我,那个使用 SQLite-net 的人。当我的表的主键上没有 AutoIncrement 时,我的代码可以正常工作。我想自动增加键,所以我重建了这样的表:

using SQLite;

namespace VehicleTracks.Models
{
    public class vehicles
    {
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string VehID { get; set; }
        public string VehYear { get; set; }
        public string VehMake { get; set; }
        public string VehModel { get; set; }
        public string VehColor { get; set; }
        public string EngineID { get; set; }
        public System.DateTime PurchaseDate { get; set; }
        public string SellerName { get; set; }
        public string SellerStreet { get; set; }
        public string SellerCityStateZip { get; set; }
        public string VehOptions { get; set; }
        public string OdomInitial { get; set; }
        public string VehBodyStyle { get; set; }
        public float PurchaseCost { get; set; }
        public byte[] VehPhoto { get; set; }
        public string VehType { get; set; }
        public string Sold { get; set; }
    }
}

现在,当尝试创建表时,我得到“AutoIncrement 附近的语法错误”。我尝试不使用 AutoIncrement,但没有它似乎不会增加 ID。

我可能错过了一些愚蠢的东西。

4

3 回答 3

6

你的代码一点都不傻;匹配https://github.com/praeclarum/sqlite-net上的代码示例。但显然代码示例是错误的,考虑到这个类似的问题:

Android表创建失败(“自动增量”附近:语法错误)?

该问题已通过删除 AutoIncrement 得到解决。或引用http://www.sqlite.org/faq.html#q1

简短回答:声明为 INTEGER PRIMARY KEY 的列将自动递增。

(请在创建表后仔细检查列是否ID实际具有类型INTEGER PRIMARY KEY。)

更长的答案:如果您将表的列声明为 INTEGER PRIMARY KEY,那么每当您在表的该列中插入 NULL 时,NULL 都会自动转换为比该列的最大值大一的整数表中的所有其他行,如果表为空,则为 1。

确保您的INSERT语句不包含 column 的显式值(除了NULLID,否则该列将不会自动递增。如果这在 SQLite-net 中是不可能的(你可能需要一个调试器),那么这很可能是一个错误。尽管令人惊讶的是,没有其他人遇到过这种情况。

也许您需要使属性可以为ID空(即使用 type int?;是的,带有问号)。请注意,我只是在这里猜测;你可能需要尝试一下。

于 2014-07-06T22:39:31.353 回答
1
sqlite> CREATE TABLE app (a INTEGER PRIMARY KEY NOT NULL, B VARCHAR);
sqlite> insert into app (b) values ('');
sqlite> insert into app (b) values ('a');
sqlite> 
sqlite> insert into app (b) values ('b');
sqlite> insert into app (b) values ('c');
sqlite> insert into app (b) values ('d');
sqlite> select * from app;
1|
2|a
3|b
4|c
5|d
sqlite> exit;

注意:AUTOINCREMENT建议不要使用IN SQLite关键字。你需要使用INTEGER PRIMARY KEY NOT NULL. 它将自动插入此属性的增量值。

于 2016-01-30T13:52:08.613 回答
0

我是 sqlite-net ( https://github.com/praeclarum/sqlite-net ) 的新手,并且遇到了自动增量 PK 的问题。

虽然我已经使用 INTEGER PRIMARY KEY 或 INTEGER PRIMARY KEY AUTOINCREMENT 创建了表,但我在插入时遇到了异常,因为 PK 在第一行中设置为 0,然后我得到了异常,因为它试图插入相同的值,所以自动增量没有工作。我所做的是编辑 DataAccess.cs 并在表类中替换了 [PrimaryKey] public Int64 id { get; 放; } for [PrimaryKey] [AutoIncrement] public Int32 id { get; 放; }。我不知道为什么它使用 bigint (Int64) 而不是 Int32,因为我在表创建中指定了 INTEGER,但现在它工作正常。我可以通过 LINQ 添加一个新项目,并且自动增量 ID(表的主键)在每一行中自动递增。

于 2016-08-22T14:03:34.287 回答