2016-01-24 16 views
12

Tôi đang cố gắng chèn các giá trị trong bảng. Nhưng chỉ có một giá trị được chèn vào. Tôi nhận được một lỗi trong đăng nhập mèo khi tôi đang cố gắng để chèn các giá trị mới.Ràng buộc UNIQUE không thành công: cơ sở dữ liệu sqlite: android

Log mèo cho thấy:

abort at 13 in [INSERT INTO event(totalminutesfrom,dayofweek,title,location,totalminutesto,id) VALUES (?,?,?,?,?,?)]: UNIQUE constraint failed: event.id 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: Error inserting totalminutesfrom=694 dayofweek=null title=qxs location=Eded & Mariz totalminutesto=0 id=0 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: event.id (code 1555) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at com.example.siddhi.timetablelayout.EventTableHelper.addEvent(EventTableHelper.java:76) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at com.example.siddhi.timetablelayout.AddEventActivity$5.onClick(AddEventActivity.java:217) 

nó hiển thị lỗi trên hai dòng sau khi chèn hàng.

db.insert(TABLE, null, values); 

    db.addEvent(new EventData(eventTitle,dayOfWeek,totalMinutesFrom, totalMinutesTo,location)); 

EventTableHelper

public class EventTableHelper extends SQLiteOpenHelper { 


    private static final String TABLE = "event"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TITLE = "title"; 
    private static final String KEY_LOCATION = "location"; 
    private static final String KEY_DAY_OF_WEEK = "dayofweek"; 
    private static final String KEY_TOTAL_MINUTES_FROM = "totalminutesfrom"; 
    private static final String KEY_TOTAL_MINUTES_TO = "totalminutesto"; 



    public EventTableHelper(Context context) { 
     super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); 
     //3rd argument to be passed is CursorFactory instance 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //createTable(db); 
    } 

    public void createTable(SQLiteDatabase db){ 
     String CREATE_EVENTS_TABLE = "CREATE TABLE " + TABLE + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT," 
       + KEY_DAY_OF_WEEK +"TEXT" + KEY_TOTAL_MINUTES_FROM +"INTEGER" 
       + KEY_TOTAL_MINUTES_TO + "INTEGER" + KEY_LOCATION + "TEXT" + ")"; 

     db.execSQL(CREATE_EVENTS_TABLE); 

    } 
    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     // db.execSQL("DROP TABLE IF EXISTS " + TABLE); 

     // createTable(db); 

     // Create tables again 
     //onCreate(db); 
    } 

    // code to add the new contact 
    public void addEvent(EventData event) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_ID, event.getId()); 
     values.put(KEY_TITLE,event.getTitle()); // Contact Name 
     values.put(KEY_DAY_OF_WEEK,event.getDayofWeek()); 
     values.put(KEY_TOTAL_MINUTES_FROM,event.getFromMinutes()); 
     values.put(KEY_TOTAL_MINUTES_TO,event.getToMinutes()); 
     values.put(KEY_LOCATION,event.getLocation()); 
     // Inserting Row 
     db.insert(TABLE, null, values); 
     //2nd argument is String containing nullColumnHack 
     db.close(); // Closing database connection 
    } 

    // code to get the single contact 
    EventData getEvent(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE, new String[] { KEY_ID, 
         KEY_TITLE, KEY_DAY_OF_WEEK, KEY_TOTAL_MINUTES_FROM,KEY_TOTAL_MINUTES_TO,KEY_LOCATION }, KEY_ID + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 
     EventData eventData = new EventData(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), 
       cursor.getInt(3),cursor.getInt(4),cursor.getString(5)); 

     return eventData; 
    } 



    // code to get all contacts in a list view 
    public List<EventData> getAllEvents() { 
     List<EventData> conList = new ArrayList<EventData>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 

       EventData event = new EventData(); 

       event.setId(Integer.parseInt(cursor.getString(0))); 
       event.setTitle(cursor.getString(1)); 
       event.setDayofWeek(cursor.getString(2)); 
       event.setFromMinutes(cursor.getInt(3)); 
       event.setToMinutes(cursor.getInt(4)); 
       event.setLocation(cursor.getString(5)); 
       // Adding contact to list 
       conList.add(event); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return conList; 
    } 
} 

Làm thế nào để giải quyết này ??

+1

Bạn đang cố chèn một id đã tồn tại. Vì chìa khóa là UNIQUE, bạn không thể. –

+0

Tôi nên chỉnh sửa mã nào? @ Hrundi V. Bakshi –

+1

Tôi sẽ tạo chìa khóa cho AUTOINCREMENT. Và sau đó tôi không vượt qua ID, vì nó sẽ được tạo tự động. –

Trả lời

14

Mã của bạn có thể vi phạm ràng buộc duy nhất của khóa chính trên trường KEY_ID.

Hai giải pháp có thể là:

  1. Hãy chắc chắn rằng giá trị EventData.getId() lợi nhuận của bạn độc đáo cho mỗi đối tượng. Hiện tại, tôi không thấy bạn truyền bất kỳ mã định danh nào cho hàm tạo của nó và có lẽ tất cả các sự kiện được chèn vào với cùng giá trị id.
  2. Nếu bạn không quan tâm đến việc tạo id, bạn có thể thêm cài đặt AUTOINCREMENT vào định nghĩa cột KEY_ID của mình. Bằng cách này, trường KEY_ID sẽ được điền tự động và mỗi hàng sẽ có giá trị duy nhất của riêng nó. Khi ở đó, đừng quên xóa thêm KEY_ID đến ContentValues một mình.
+0

cảm ơn u rất nhiều ... giải pháp thứ hai làm việc cho tôi ... Đã không chèn id .. @ Mateusz Herych –

+0

..... Siêu bro ... bạn đã lưu ngày của tôi .. tôi biết nó. Nhưng tôi đã quên it ..Cảm ơn +1 phiếu bầu –

+0

Wow, người đầu tiên đang làm việc cho tôi cảm ơn, @Mateusz Herych –

5

Bảng có một ràng buộc duy nhất trên đó. Điều đó có nghĩa rằng chỉ có một hàng có thể tồn tại với một giá trị ID đã cho. Nếu bạn đang cố gắng thay đổi một số giá trị cho một hàng, hãy sử dụng UPDATE không INSERT. Nếu bạn đang cố gắng thêm hàng này, bạn cần cung cấp cho nó một ID duy nhất khác hoặc trước tiên bạn cần xóa hàng đã tồn tại trước đó. Câu trả lời đúng nào là câu trả lời đúng tùy thuộc vào ứng dụng của bạn đang làm gì.

2

Hãy thử kiểm tra xem ID đã tồn tại chưa. Nếu đúng, không chèn, vì bạn đã có hàng với ID này.

0

Tôi ban đầu đặt trẻ sơ sinh ràng buộc duy nhất mới của gói cũ. Thay vào đó hãy chắc chắn bạn đang cột duy nhất hiện nay là đầu tiên:

CREATE TABLE TEST (client_id TEXT unique, remote_id INT unique) 
0

sai lầm của tôi là, tôi đã cố gắng để lấp đầy ID cột mặc dù nó đã được xác định đã là một INTEGER PRIMARY KEY AUTOINCREMENT

1

làm cột id id nguyên autoincrement, và làm không đặt giá trị id vào giá trị nội dung.

Các vấn đề liên quan