9

SQLiteDatabase.CONFLICT_IGNORE を使用して、insertWithOnConflict を呼び出しています。ただし、競合が発生すると、既存の行の ID の代わりに「-1」が返されます。これを修正するにはどうすればよいですか?

テーブルの作成:

編集 :

String CREATE_CATEGORY_TABLE = "CREATE TABLE "+TABLE_CATEGORY+"(" +
    BaseColumns._ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
    KEY_CATEGORY_NAME+" TEXT UNIQUE" +
    ")";
db.execSQL(CREATE_CATEGORY_TABLE);

ステートメントを挿入:

ContentValues values = new ContentValues();
values.put(KEY_CATEGORY_NAME, name);
int catID = (int) db.insertWithOnConflict(TABLE_CATEGORY, null, values, SQLiteDatabase.CONFLICT_IGNORE);
4

5 に答える 5

2

Androidは、主キー列がと呼ばれることを想定しています_id。原因の可能性があります。列が存在しないため、値を返すことができず、-1を返します。

于 2012-09-11T02:40:37.077 に答える
2

SQLiteDatabase.CONFLICT_IGNORE コメントは、あなたが観察したのと同じように機能するはずです。挿入しようとしているときに競合する行がない場合は、指定された値で新しい行が挿入され、新しく挿入された行の ID が返されます。一方、(同じ一意のキーを持つ) 競合する行が既に存在する場合、入力値は無視され、既存の行が保持され、競合シナリオを示すために戻り値が -1 になります。詳細を知り、この戻り値を処理する方法を理解するには、Android/SQLite: Insert-Update table columns to keep the identifierをお読みください。

于 2013-04-15T12:07:37.413 に答える
1

私が使用した回避策は、insertOrThrowの代わりに使用しinsertWithOnConflict、明示的にキャッチすることSQLiteConstraintExceptionです。から継承しているため、明示的にキャッチする必要がありますRuntimeException

insert競合が発生したときにデータベーススキームをログにダンプしていたため、この回避策を使用する必要がありましたが、これは受け入れられませんでした。

于 2014-11-10T17:55:04.763 に答える
0
try {
        long id = db.insertWithOnConflict(StatusData.TABLE, null, values, SQLiteDatabase.CONFLICT_IGNORE);
        if (id == -1){
            throw new RuntimeException(String.format("%s: Failed to insert [%s] to [%s] for unkwon reason.",TAG,values,uri));
        }else
            return ContentUris.withAppendedId(uri, id);
    }

データベースに挿入された行をまだ取得できます.CONFLICT_IGNOREは期待どおりに機能しません.@Tomは正しいですが、その問題が修正されたかどうかはわかりません.

于 2013-08-08T14:35:39.850 に答える