2012-09-11 24 views
8

Tôi đang gọi insertWithOnConflict, sử dụng SQLiteDatabase.CONFLICT_IGNORE. Tuy nhiên, khi xung đột xảy ra "-1" được trả về thay cho id của hàng hiện tại. Làm cách nào để sửa lỗi này?Android: SQLite - insertWithOnConflict

Bảng tạo:

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

Chèn tuyên bố:

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

Giá trị trả về -1 có nghĩa là đã xảy ra lỗi. Liệu nó cũng trả về -1 nếu bạn chèn một hàng duy nhất (không xung đột)? –

+0

@Graham Borland: Không. Chèn không xung đột sẽ trả lại id hàng chính xác. – meeeee

Trả lời

1

Android hy vọng cột khóa chính được gọi là _id. Có thể là nguyên nhân: vì cột không tồn tại, nó không thể trả về giá trị và trả về -1.

+2

đã thử sử dụng BaseColumns._ID nhưng tôi vẫn nhận được -1, – meeeee

1

SQLiteDatabase.CONFLICT_IGNORE nhận xét được cho là hoạt động giống như cách bạn đã quan sát. Trong khi cố gắng chèn, nếu không có hàng xung đột, thì nó sẽ chèn một hàng mới với các giá trị đã cho và trả về id của hàng mới được chèn vào. Mặt khác, nếu đã có một hàng xung đột (với cùng khóa duy nhất), thì các giá trị đến sẽ bị bỏ qua và hàng hiện tại sẽ được giữ lại và giá trị trả về sẽ là -1 để chỉ ra một kịch bản xung đột. Để biết thêm chi tiết và để hiểu làm thế nào để xử lý giá trị trả về này, vui lòng đọc 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); 
    } 

tôi vẫn có thể nhận được hàng đưa vào cơ sở dữ liệu, các CONFLICT_IGNORE không hoạt động như mong đợi @ Tom là đúng, nhưng tôi không chắc chắn nếu vấn đề đó đã được cố định

1

Cách giải quyết mà tôi sử dụng là sử dụng 01.thay vì insertWithOnConflict và bắt một cách rõ ràng SQLiteConstraintException. Bạn cần phải nắm bắt nó một cách rõ ràng vì nó kế thừa từ RuntimeException.

Tôi đã phải sử dụng giải pháp này vì insert đã bán phá giá lược đồ cơ sở dữ liệu cho nhật ký khi có xung đột và điều đó là không thể chấp nhận.