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

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

所有的结果都是零!有想法吗?

最佳答案

默认情况下,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 类应该为您处理这个。

关于Android 数据库 SQLite 自动增量不递增并且违反了主要约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081845/

相关文章:

C# SqlCeDataReader rdata FieldCount

database - 为什么 Postgres 从 9.4 开始对 ALTER TABLE ADD COLUMN 语句强制执行 ACCESS EXCLUSIVE 锁?

sql - 术语 DDL、DML 和 DCL 的起源是什么?

android - 在 Recyclerview 中显示来自内部存储的图像

java - Android 11 上的沉浸式全屏

android - RxJava。顺序执行

mysql - 使用 where 子句从另一个表中选择数据

sql - 分区总和

php - 在 PHP 中循环访问单个服务器上的 MySQL 数据库

android - Crashlytics 添加新的 applicationIdSuffix