使用此命令创建表:
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());
}
所有结果都是零!什么想法?
答案 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 );
由于某种原因,不应声明列类型...