2012-07-04 11 views
7

に無視される文を作成します。CONFLICT ONアンドロイドsqlLite IGNOREが、私は次のように簡単なアドレステーブルを持っているICS

"CREATE TABLE " + ADDRESSES_TABLE + " (" + 
       KEY_ADDRESS_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       KEY_ADDRESS_COUNTRY + " TEXT, " + 
       KEY_ADDRESS_CITY + " TEXT, " + 
       KEY_ADDRESS_STREET + " TEXT, " + 
       KEY_ADDRESS_HOUSE + " TEXT, " + 
       KEY_ADDRESS_POSTAL_CODE + " TEXT," + 
       "UNIQUE("+KEY_ADDRESS_COUNTRY+","+KEY_ADDRESS_CITY+","+KEY_ADDRESS_STREET+","+KEY_ADDRESS_HOUSE+","+KEY_ADDRESS_POSTAL_CODE +") ON CONFLICT IGNORE)" 

私は重複したレコードを追加すると、挿入は、()のIDを返しますがmetod -1ず既存の行

問題は4.0以降でのみ再現可能です。このメソッドは、2.2および2.3.3で期待どおりに機能します。

誰も同じ問題に直面しましたか?

+0

'insert'または' insertWithOnConflict'を使用していますか? – Barak

+0

私は両方を試してみましたが、INSERTWithOnConflictは、私がTABLE CREATEでON CONFLICT IGNOREを指定した場合意味がないと思います。 – Zzokk

答えて

9

残念ながら、Androidのドキュメントは間違っています。 (したがって、あなたのコードは2.2や2.3などの以前のバージョンのAndroidでは期待通りに動作しません)

2.2と2.3では、insertWithOnConflict()はSQLite C API関数sqlite3_last_insert_rowid()の値を返します。失敗した挿入(IGNOREのようなON CONFLICT解決が適用される場所など)は戻り値に影響しません。したがって、接続の前の挿入が実行されておらず、重複挿入が試行された場合、insertWithOnConflict()は0を返します。以前の挿入が行を任意のテーブルに追加した場合、メソッドはの行IDを返します。挿入---もちろん、これはひどく間違っています。 4.0では

insertWithOnConflict()は-1を返す代わりに0

のあなたが今エラーを観察している理由この変更はある以外、同じのSQLite C API関数の値を返します。しかし、2.2と2.3で密接に結果を確認すると、OR IGNORE節が実行されたときに返される行IDは、実際に正しい行IDではないことがわかります(偶然を除いて)。

+0

これが本当に正しい動作ならば、あなたは[バグとして提出する]必要があります(http://source.android.com/source/report-bugs.html)...傷つけることはできませんでした:D –

+1

それはそこにあります問題13045:https://code.google.com/p/android/issues/detail?id=13045 –

+1

ご清聴ありがとうございます。私は本当にこの方法に頼っていました。だから、最高の回避策は次のとおりです。 試し{ insertOrThrow(/ *必要なすべてのparams * /) } キャッチ(のSQLException e)は{ //必要なレコードを選択し、それから 主キーを取得する} はそれではないです時間の面でDBのために重すぎる? – Zzokk

関連する問題