2012-09-11 6 views
8

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

表の作成:

EDIT:

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); 
+0

戻り値-1は、エラーが発生したことを意味します。一意の(競合しない)行を挿入すると-1も返されますか? –

+0

@Graham Borland:いいえ、競合しない挿入は、正しい行IDを返します。 – meeeee

答えて

1

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

+2

BaseColumns._IDを使用しようとしましたが、 – meeeee

1

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

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は正しいですが、私は確認していないという問題が修正されました場合

1

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

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

関連する問題