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 に関するいくつかの記事を読みました。しかし、「挿入または置換」+「INTEGER PRIMARY KEY AUTOINCREMENT」に関連する投稿は見つかりません。

4

2 に答える 2

6

私はあなたのコードがそれがしているはずのことを正確にやっていると思います。コードを読むと、すでに何かが挿入されている挿入を無視したいようです。表示されるエラーは、挿入が失敗したことを示しています。

INSERT IGNOREを使用すると、キーが重複する場合、行は実際には挿入されません。ただし、ステートメントはエラーを生成しません。代わりに警告が生成されます。これらのケースには次のものが含まれます。

PRIMARYKEYまたはUNIQUE制約のある列に重複キーを挿入します。NOTNULL制約のある列にNULLを挿入します。パーティション化されたテーブルに行を挿入しますが、挿入する値はパーティションにマップされません。- 「INSERTIGNORE」と「INSERT...ONDUPLICATEKEYUPDATE」

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 に答える