SQLite 自动增量不起作用

Posted

技术标签:

【中文标题】SQLite 自动增量不起作用【英文标题】:SQLite auto increment not working 【发布时间】:2013-05-25 19:20:53 【问题描述】:

好的,这不是垃圾邮件,应该很简单我不知道为什么它不起作用 这是我的代码:

gamesdatabase = openOrCreateDatabase("GamesDatabase", MODE_PRIVATE, null);
gamesdatabase.execSQL("CREATE TABLE IF NOT EXISTS Games (ID INTEGER PRIMARY KEY, Name
VARACHAR, NPlayers INT(1), NRounds INT(2), WinScore INT(2));");

gamesdatabase.execSQL("INSERT INTO Games 
(ID, Name, NPlayers, NRounds, WinScore ) VALUES ( NULL, 'TAWLA',2,0,0 );");

gamesdatabase.execSQL("INSERT INTO Games 
(ID, Name, NPlayers, NRounds, WinScore ) VALUES ( NULL, 'DOMANA',4,0,0 );");


Cursor c = gamesdatabase.rawQuery("SELECT * FROM Games", null);
c.moveToFirst();
while (c.isAfterLast() == false) 
Log.d("BEZRA", String.valueOf(c.getInt(c.getColumnIndex("ID"))));
c.moveToNext();

这有什么问题?日志显示所有记录为 0

【问题讨论】:

自动增量有效。你只需要实际使用它。 循环游标值的方式太复杂了。看***.com/questions/10723770/… 【参考方案1】:

SQLite 表的主键称为 _id。它是自动递增的,您不应该尝试向其中插入值。

gamesdatabase = openOrCreateDatabase("GamesDatabase", MODE_PRIVATE, null);
gamesdatabase.execSQL("CREATE TABLE IF NOT EXISTS Games (_id INTEGER PRIMARY KEY, Name
VARACHAR, NPlayers INT(1), NRounds INT(2), WinScore INT(2));");

gamesdatabase.execSQL("INSERT INTO Games 
(Name, NPlayers, NRounds, WinScore ) VALUES ('TAWLA',2,0,0 );");

gamesdatabase.execSQL("INSERT INTO Games 
(Name, NPlayers, NRounds, WinScore ) VALUES ('DOMANA',4,0,0 );");


Cursor c = gamesdatabase.rawQuery("SELECT * FROM Games", null);
c.moveToFirst();
while (c.isAfterLast() == false) 
Log.d("BEZRA", String.valueOf(c.getInt(c.getColumnIndex("_id"))));
c.moveToNext();

【讨论】:

其实列名不需要命名为“_id” 您可能是对的,但您是在评论我 8 年前给出的答案。【参考方案2】:

对我有用的是将我的创建类型从 INT 重命名为 INTEGER 并开始工作。

从这里:

CREATE TABLE IF NOT EXISTS foo (id INT PRIMARY KEY, bar INT)

到这里:

CREATE TABLE IF NOT EXISTS foo (id INTEGER PRIMARY KEY, bar INT)

【讨论】:

无论出于何种原因,这是正确的答案。【参考方案3】:

c.getColumnIndex("ID") 获取列的索引,其中ID为0索引列,名称为1等

你想要的

c.getInt(c.getColumnIndex("ID"))

【讨论】:

就像代码中的那样,复制它是我的错,它不起作用谢谢 这回答了我在使用代码时遇到的问题。谢谢!【参考方案4】:

你可以看到 http://alvinalexander.com/android/sqlite-autoincrement-serial-identity-primary-key 示例 CRETAE_TABLE

  CREATE TABLE salespeople (
  id INTEGER PRIMARY KEY,
  first_name TEXT NOT NULL,
  last_name TEXT NOT NULL,
  commission_rate REAL NOT NULL
);

插入数据

 INSERT INTO salespeople VALUES (null, 'Fred', 'Flinstone', 10.0);

---或---

INSERT INTO salespeople (first_name, last_name, commission_rate) VALUES ('Fred', 'Flinstone', 10.0);

【讨论】:

【参考方案5】:

您想告诉它该列是自动递增的。

ID INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL

改为。

【讨论】:

它没有用,但无论如何感谢,诀窍在于将 ID 重命名为 _id,使用整数主键时不需要 AUTOINCREMENT【参考方案6】:

因为您没有将其设置为自动递增。主键不够用。

CREATE TABLE IF NOT EXISTS Games (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARACHAR, NPlayers INT(1), NRounds INT(2), WinScore INT(2));

【讨论】:

我确实设置了 AUTOINCREMENT 但没有用,然后我读到主键绰绰有余 我写的不够。您需要主键和自动增量。 @Gustek,sqlite 假定使用 PRIMARY KEY 指定的字段自动递增 根据sqlitesqlite.org/autoinc.html文档,PK足以获得唯一的id,而且通常它们是单调的(除非你给自己设置了一些奇怪的id)

以上是关于SQLite 自动增量不起作用的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB自动增量不起作用

MongoDB自动增量不起作用

自动增量(身份)在 Fluent NHibernate 中不起作用

GORM 和 SQL Server:自动增量不起作用

Mysql 视图 - 自动增量不起作用(通过 Eloquent ORM)

在具有多个表的 sqlite 数据库中删除行不起作用