Android数据库SQLite自动增量未递增且违反了主要约束

时间:2013-11-19 20:56:22

标签: android sql database auto-increment

使用此命令创建表:

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

所有结果都是零!什么想法?

3 个答案:

答案 0 :(得分:2)

默认情况下,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解析器非常慷慨,并被接受为数据类型。它不知道该如何处理它,只是把它当作一个blob来处理,并没有任何限制。因此,即使您的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类应该为您处理。

答案 1 :(得分:0)

the sqlite docs来看,定义应该稍微改变一下。

定义应该是:

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

答案 2 :(得分:0)

简单地说:

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

由于某种原因,不应声明列类型...