在Android中使用AUTOINCREMENT键插入或忽略表格。

5

我正在尝试向一个新的空表插入数据。但是我一直收到错误提示(错误代码19:约束失败)。我认为问题可能是由于“INTEGER PRIMARY KEY AUTOINCREMENT”引起的。这是我的代码:

database.execSQL("CREATE TABLE IF NOT EXISTS contacts (cid INTEGER PRIMARY KEY AUTOINCREMENT, name varchar NOT NULL, user varchar NOT NULL, UNIQUE(user) ON CONFLICT REPLACE)");
...
String sql = "INSERT OR IGNORE INTO contacts ( name , user) VALUES (?, ?)";
database.beginTransaction();

SQLiteStatement stmt = database.compileStatement(sql);
stmt.bindString(1, name);
stmt.bindString(2, entry.getUser());
int i = (int)stmt.executeInsert();
stmt.execute();
stmt.clearBindings();
stmt.close();

// error: 06-11 20:50:42.295: E/DB(12978): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

请问有人知道这个SQL语句的问题在哪里吗?我应该如何解决这个问题呢?谢谢。
我在stackoverflow上阅读了几篇文章,但没有找到任何与“insert or replace”和“INTEGER PRIMARY KEY AUTOINCREMENT”相关的帖子。

2个回答

6
我认为您的代码正在按照预期执行。阅读您的代码后,我想您希望它在已经插入内容的情况下忽略插入。您收到的错误提示表明插入失败了。
如果您使用INSERT IGNORE,当插入重复键时,该行实际上将不会被插入。但该语句不会生成错误,而是生成警告。这些情况包括:
- 在具有PRIMARY KEY或UNIQUE约束的列中插入重复键。 - 向具有NOT NULL约束的列中插入NULL。 - 插入到分区表中的行,但插入的值无法映射到分区。"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE" 我建议捕获SQLiteConstraintException或在插入之前检查数据是否已存在。如果您需要一些关于如何检查数据是否已插入的想法,请让我知道,我以前也做过这个。希望对你有所帮助。

0

有一个很好的开始到结束,Lars Vogella在这里编写的Android SQLite示例

在那里面,稍微往下滑一点,他使用以下字符串来创建表:

// Database creation sql statement
private static final String DATABASE_CREATE = "create table "
        + TABLE_COMMENTS + "(" + COLUMN_ID
        + " integer primary key autoincrement, " + COLUMN_COMMENT
        + " text not null);";

我刚刚没有尝试过他的或者你的,但是我注意到他和你之间有一些不同:

  • 他在表名和开括号之间没有空格
  • 他在 SQL 字符串中,在闭括号后面加了一个分号。

我不确定这些是否能为你解决问题,但这可能是一个好的开始。


谢谢Tim,我尝试了你的建议,但它并没有起作用。 - mobile app Beginner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接