Android数据库SQLLite AutoIncrement未递增,违反了主要约束



im使用以下命令创建表格:

create table if not exists Event ( _id long INTEGER AUTO INCREMENT,repeatEvery long ,repeating int ,startTime long ,title text ,primary key (_id) );

还尝试了不带_前缀的id,然后我用获取所有行

database.query("Event",null , null, null, null, null, null);

然后我查看打印ID列的结果:

if (c.moveToFirst()) {
            do {
                System.out.println(c.getLong(c.getColumnIndexOrThrow("_id")));  
            } while (c.moveToNext());
        }

所有结果都是零!有人知道吗?

SQLITE默认情况下会为您添加一个INTEGER AUTOINCREMENT。搜索ROWID。创建一个复制此功能的列将被创建为ROWID的别名。

我做了更多的挖掘,发现了一些问题。首先,SQLITE是垃圾。

以下是您需要使用的正确SQL语句。

CREATE TABLE Event (_id INTEGER PRIMARY KEY AUTOINCREMENT,repeatEvery long ,repeating int ,startTime long ,title text)

我在您的代码示例中发布了一个,id列的类型为"INTEGER AUTO INCREMENT"。SQLITE解析器非常慷慨,并接受它作为数据类型。它不知道该怎么处理它,只是把它当作一个斑点,所有的约束都不起作用。因此,即使您的DDL不正确,SQLITE也足够好,可以对错误之处进行最佳猜测,并且不会麻烦您知道。:[

如果您打印应用程序事件表的架构,您应该会看到INTEGER AUTO INCREMENT问题。

另一个需要注意的问题,

如果你自己写插入语句,你需要用这两种方式中的一种。

insert into Event (repeatEvery, repeating, startTime, title) values (1,2,3, "title");

insert into Event values (NULL, 1,2,3, "title");

SQLITE Helper类应该为您处理此问题。

从sqlite文档来看,似乎应该稍微更改一下定义。

定义应该是:

create table if not exists Event ( _id INTEGER PRIMARY KEY, repeatEvery long, repeating int, startTime long, title text );

简单地说:

create table if not exists Event ( _id INTEGER PRIMARY KEY,repeatEvery long ,repeating int ,startTime long ,title text );

出于某种原因,不应声明列类型。。。

最新更新