在Android中使用AUTOINCREMENT键的INSERT或IGNORE表

mob*_*ner 5 sqlite android replace insert

我正在尝试将数据插入到新的空表中.但我一直收到错误(错误代码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
Run Code Online (Sandbox Code Playgroud)

谁知道sql语句有什么问题?我怎么解决这个问题?谢谢
我已经阅读了很多关于stackoverflow的文章.但找不到任何与"插入或替换"+"INTEGER PRIMARY KEY AUTOINCREMENT"相关的帖子.

小智 6

我认为你的代码完全按照它应该做的去做.阅读您的代码,看起来您希望它忽略插入已插入的内容.您收到的错误告诉您插入失败.

如果使用INSERT IGNORE,则实际上不会插入行,如果它导致重复键.但该声明不会产生错误.它会生成警告.这些案件包括:

在具有PRIMARY KEY或UNIQUE约束的列中插入重复键.将NULL插入到具有NOT NULL约束的列中.将行插入分区表,但插入的值不会映射到分区.- "INSERT IGNORE"vs"INSERT ... ON DUPLICATE KEY UPDATE"

我建议在插入之前捕获SQLiteConstraintException或检查以查看数据是否已存在.如果您需要一些关于如何检查数据是否已插入的想法让我知道,我之前必须这样做.希望这可以帮助.