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

时间:2012-06-11 13:23:15

标签: android sqlite insert replace

我正在尝试将数据插入到新的空表中。但我一直收到错误(错误代码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的文章。但找不到任何与'插入或替换'+'INTEGER PRIMARY KEY AUTOINCREMENT'相关的帖子。

2 个答案:

答案 0 :(得分:6)

我认为你的代码正在完成它本应该做的事情。阅读您的代码,看起来您希望它忽略插入已插入的内容。您收到的错误告诉您插入失败。

  

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

     

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

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

答案 1 :(得分:0)

结束example of SQLite on Android written by Lars Vogella here

有一个好的开始

在里面,这里有一些方法是他用来创建表格的字符串:

// 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字符串中有一个分号。在右括号之后。

我不确定这些是否适合你,但这可能是一个好的开始。