web-dev-qa-db-fra.com

La contrainte UNIQUE a échoué: base de données sqlite: android

J'essaie d'insérer des valeurs dans un tableau. Mais il n'y a qu'une seule valeur insérée. Je reçois une erreur dans le journal du journal lorsque j'essaie d'insérer de nouvelles valeurs. 

Journal des expositions de chat:

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)

Son montrant une erreur sur ces deux lignes lors de l'insertion d'une ligne.

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

Comment résoudre ce problème ??

26
user5669913

Votre code viole probablement la contrainte d'unicité de la clé primaire sur un champ KEY_ID.

Deux solutions possibles sont:

  1. Assurez-vous que votre EventData.getId() renvoie des valeurs uniques par objet. Pour l'instant, je ne vois pas que vous transmettiez d'identifiant à son constructeur et tous les événements sont peut-être insérés avec la même valeur id.
  2. Si vous ne souhaitez pas générer vous-même d'id, vous pouvez ajouter le paramètre AUTOINCREMENT à votre définition de colonne KEY_ID. De cette façon, le champ KEY_ID sera rempli automatiquement et chaque ligne aura sa propre valeur unique. Une fois là-bas, n'oubliez pas de supprimer vous-même l'ajout de KEY_ID à ContentValues.
23
Mateusz Herych

Pour les développeurs utilisant Bibliothèque de persistance de la pièce . Vous pouvez utiliser 

@Insert(onConflict = OnConflictStrategy.REPLACE)  // or OnConflictStrategy.IGNORE

dans DAO selon Insert Documentation

30
Dasser Basyouni

La table a une contrainte unique sur elle. Cela signifie qu’une seule ligne peut exister avec une valeur d’ID donnée. Si vous essayez de modifier certaines des valeurs d'une ligne, utilisez UPDATE et non INSERT. Si vous essayez d'ajouter cette ligne, vous devez lui attribuer un ID unique et différent ou vous devez d'abord supprimer la ligne préexistante. Laquelle de ces réponses est la bonne réponse dépend de ce que fait votre application.

7
Gabe Sechan

Essayez de vérifier si l'ID existe déjà. Si true, ne l'insérez pas car vous avez déjà la ligne avec cet ID.

4
Kai Wang

make id column id entier entier auto-incrémenté et ne mettez pas la valeur id dans les valeurs de contenu.

1
Vickie Kangare

Mon erreur a été, j'ai essayé de remplir la colonne ID bien qu'elle ait déjà été définie comme un INTEGER PRIMARY KEY AUTOINCREMENT

1
Sam

Je mis à l'origine la nouvelle contrainte unique infantile de l'ancienne. Au lieu de cela, assurez-vous que votre colonne unique actuelle est la première:

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

J'ai eu le même problème et le problème était que j'ai oublié d'ajouter db.execSQL(YOUR_TABLE); dans ma DbHelper

0
EAMax