La restricción UNIQUE falló: base de datos sqlite: android

Estoy tratando de insertar valores en la tabla. Pero sólo hay un valor insertado. Estoy recibiendo un error en log cat cuando estoy tratando de insertar nuevos valores.

Muestra de gato de registro:

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) 

Su error de la demostración en estas dos líneas mientras que inserta la fila.

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

¿Cómo resolver esto?

5 Solutions collect form web for “La restricción UNIQUE falló: base de datos sqlite: android”

Su código probablemente viola la restricción de unicidad de la clave primaria en un campo KEY_ID .

Dos posibles soluciones son:

  1. Asegúrese de que EventData.getId() devuelve valores únicos por objeto. Por ahora, no veo que pase ningún identificador a su constructor y tal vez todos los eventos se insertan con el mismo valor de id .
  2. Si no le importa generar IDs por sí mismo, puede agregar la configuración AUTOINCREMENT a su definición de columna KEY_ID . De esta manera el campo KEY_ID se llenará automáticamente y cada fila tendrá su propio valor único. Una vez allí, no olvide eliminar la adición de KEY_ID a KEY_ID por usted mismo.

La tabla tiene una restricción única en ella. Esto significa que sólo puede existir una fila con un valor ID dado. Si está intentando cambiar algunos de los valores de una fila, utilice UPDATE no INSERT. Si está intentando agregar esta fila, necesita darle un ID diferente o único o borrar primero la fila preexistente. Cuál de estas es la respuesta correcta depende de lo que esté haciendo su aplicación.

Intente comprobar si el ID ya existe. Si es verdadero, no lo inserte, porque ya tiene la fila con este ID.

Inicialmente puse la nueva restricción única infantil de la antigua. En su lugar, asegúrese de que su columna actual es la primera:

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

Mi error fue, traté de rellenar la columna de ID , aunque ya se definió como un INTEGER PRIMARY KEY AUTOINCREMENT

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.