UNIQUE constraint failed: sqlite database : android

匿名 (未验证) 提交于 2019-12-03 02:00:02

问题:

I am trying to insert values in table. But there is only one value inserted. I am getting an error in log cat when I am trying to insert new values.

Log cat shows :

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)

Its showing error on these two lines while inserting row.

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 getAllEvents() {         List conList = new ArrayList();         // 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;     } }

How to solve this??

回答1:

Your code probably violates primary key's uniqueness constraint on a KEY_ID field.

Two possible solutions are:

  1. Make sure that your EventData.getId() returns unique values per object. For now, I don't see you pass any identifier to its constructor and perhaps all the events are inserted with the same id value.
  2. If you don't care about generating ids by yourself, you can add AUTOINCREMENT setting to your KEY_ID column definition. This way KEY_ID field will be filled automatically and each row will have its own, unique value. Once there, don't forget to remove adding KEY_ID to ContentValues by yourself.


回答2:

The table has a unique constraint on it. That means that only one row can exist with a given ID value. If you're trying to change some of the values for a row, use UPDATE not INSERT. If you're trying to add this row, you need to either give it a different, unique ID or you need to delete the pre-existing row first. Which of these is the right answer depends on what your app is doing.



回答3:

Try checking if the ID is already existed. If true, do not insert, because you already have the row with this ID.



回答4:

make id column id integer autoincrement, and do not put the id value into content values.



回答5:

I originally put the new unique constraint infant of the old one. Instead make sure you're current unique column is first:

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


回答6:

My mistake was, I tried to fill ID column though it was defined already as a INTEGER PRIMARY KEY AUTOINCREMENT



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!