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 );
出于某种原因,不应声明列类型。。。