【问题标题】:Android Database SQLLite AutoIncrement not incrementing and primary constraint violatedAndroid 数据库 SQLite 自动增量不递增且违反主约束
【发布时间】:2013-12-03 14:43:37
【问题描述】:

我用这个命令创建一个表:

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

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

【问题讨论】:

  • 我做了一些挖掘工作,看起来这是 AUTO INCREMENT 是 2 个作品的问题。重新访问我的解决方案以获得更深入的解释。

标签: android sql database auto-increment


【解决方案1】:

简单地说:

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

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

【讨论】:

  • 你在这个语句中有两次主键,这会导致问题吗?
【解决方案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 类应该为你处理这个问题。

【讨论】:

  • 可以通过光标检索吗?
  • System.out.println(c.getLong(c.getColumnIndexOrThrow("ROWID")));
  • 我查看了 SQLite 源代码,试图了解它为什么将类型解析为“INTEGER AUTO INCREMENT”……大错特错。所有 SQLite 都是 3 个文件。其中之一具有所有代码。 ;__;
【解决方案3】:

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

定义应该是:

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

【讨论】:

  • 有什么异常?
  • 你会看到我输入了PRIMARY KEY 并从末尾删除了,primary key (_id)。更多详情请见sqlite.org/faq.html#q1
  • 那里有一个if not exists,您确定要删除旧表并创建一个新表吗?
  • 我在启动时使用 deleteDatabase(..) 删除数据库并重新创建它以进行调试
  • 我也不认为这个解决方案有什么问题。 SQLITE 文档说任何 INTEGER PRIMARY KEY 字段都将自动设置为 AUTOINCREMENT。当我使用 SQLITE DB 编写 Android 应用程序时,我会为我的主要活动的 onCreate 中的每个表发出“DROP TABLE XYZ”。 Android 的 SQLite 不如其他东西友好:/
猜你喜欢
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 2017-04-30
  • 2015-05-11
相关资源
最近更新 更多