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的文章。但找不到与“插入或替换”+“整数主键自动增量”相关的任何帖子。

4

2 回答 2

6

我认为你的代码正在做它应该做的事情。阅读您的代码,您似乎希望它忽略已经插入内容的插入。您收到的错误是告诉您插入失败。

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

在具有 PRIMARY KEY 或 UNIQUE 约束的列中插入重复键。将 NULL 插入具有 NOT NULL 约束的列中。向分区表插入一行,但插入的值未映射到分区。- “插入忽略”与“插入......重复密钥更新”

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

于 2012-06-17T12:55:12.810 回答
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 字符串中有一个分号。在右括号之后。

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

于 2012-06-11T13:31:01.237 回答