2016-01-24 3 views
12

Я пытаюсь вставить значения в таблицу. Но вставлено только одно значение. Я получаю сообщение об ошибке в log cat, когда пытаюсь вставить новые значения.УНИКАЛЬНОЕ ограничение не удалось: база данных sqlite: android

Вход кот показывает:

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) 

Его показывая ошибку на этих двух строк при вставке строки.

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

Как решить эту проблему ??

+1

Вы пытаетесь вставить уже существующий идентификатор. Поскольку ключ UNIQUE, вы не можете. –

+0

Какой код я должен изменить? @ Хрунди В. Бакши –

+1

Я бы сделал ключ автоинкрементным. И тогда я не передал идентификатор, так как он будет автоматически сгенерирован. –

ответ

14

Ваш код, вероятно, нарушает ограничение уникальности первичного ключа на поле KEY_ID.

Два возможного решения:

  1. Убедитесь, что ваш EventData.getId() возвращает уникальные значений для каждого объекта. На данный момент я не вижу, чтобы вы передавали какой-либо идентификатор его конструктору и, возможно, все события вставлялись с тем же значением id.
  2. Если вы не заботитесь о создании идентификаторов самостоятельно, вы можете добавить AUTOINCREMENT в настройку столбца KEY_ID. Таким образом, поле KEY_ID будет заполнено автоматически, и каждая строка будет иметь свое собственное уникальное значение. Как только там, не забудьте удалить добавление KEY_ID в ContentValues самостоятельно.
+0

спасибо, что так много ... второе решение сработало для меня ... Не вставлял идентификатор. @ Mateusz Herych –

+0

..... Супербр ... ты спас свой день..и знал это. Но я забыл он .. Спасибо +1 голос –

+0

Ничего себе, первый работает для меня спасибо, @Mateusz Herych –

5

Таблица имеет уникальное ограничение. Это означает, что может существовать только одна строка с заданным значением ID. Если вы пытаетесь изменить некоторые значения для строки, используйте UPDATE, а не INSERT. Если вы пытаетесь добавить эту строку, вам нужно либо указать ей другой уникальный идентификатор, либо сначала удалить ранее существовавшую строку. Какой из них правильный ответ зависит от того, что делает ваше приложение.

2

Попробуйте проверить, существует ли идентификатор. Если true, не вставляйте, потому что у вас уже есть строка с этим идентификатором.

0

Я изначально поставил новое уникальное ограничение младенца старого. Вместо того, чтобы убедиться, что вы тока уникальный столбец первой:

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

Моя ошибка была, я попытался заполнить ID колонку, хотя это было определено уже как INTEGER PRIMARY KEY AUTOINCREMENT

1

макияжем Идентификатор столбца Идентификатор целого Autoincrement, и сделать не ставьте значение id в значения содержания.

Смежные вопросы