La contrainte UNIQUE a échoué: la base de données sqlite : android
Je suis en train d'insérer des valeurs dans le tableau. Mais il y a une seule valeur insérée. J'obtiens une erreur dans le journal de chat lorsque j'essaie d'insérer de nouvelles valeurs.
Journal des spectacles 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)
Sa montre l'erreur sur ces deux lignes lors de l'insertion de la 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??
Vous essayez d'insérer un id. Puisque la clé est UNIQUE, vous ne pouvez pas.
quel code dois-je modifier? @ Hrundi V. Bakshi
Je ferais le key AUTOINCREMENT. Et puis je n'avais pas passer l'ID, car il serait généré automatiquement.
quel code dois-je modifier? @ Hrundi V. Bakshi
Je ferais le key AUTOINCREMENT. Et puis je n'avais pas passer l'ID, car il serait généré automatiquement.
OriginalL'auteur | 2016-01-24
Vous devez vous connecter pour publier un commentaire.
Votre code viole probablement la clé primaire de la contrainte d'unicité sur une
KEY_ID
champ.Deux solutions possibles sont:
EventData.getId()
retourne les valeurs uniques par objet. Pour l'instant, je ne vois pas de vous passer de tout identifiant à son constructeur et peut-être tous les événements sont insérés avec le mêmeid
valeur.AUTOINCREMENT
réglage de votreKEY_ID
définition de la colonne. De cette façon,KEY_ID
champ sera rempli automatiquement et chaque ligne aura sa propre valeur. Une fois là-bas, n'oubliez pas de supprimer l'ajout deKEY_ID
àContentValues
par vous-même......Super bro...vous avez sauvé ma journée..je le savais .mais je l'ai oublié ..Merci +1 vote
Wow, première marche pour moi merci, @Mateusz Herych
Merci, frère, vous êtes un sauveteur :*
OriginalL'auteur Mateusz Herych
Pour les développeurs utilisant Salle De La Persistance De La Bibliothèque. Vous pouvez utiliser
dans DAO selon Insérer De La Documentation
OriginalL'auteur Dasser Basyouni
La table a une contrainte d'unicité. Cela signifie que seulement une ligne avec une valeur de l'ID. Si vous essayez de changer les valeurs d'une ligne, utilisez mise à JOUR de l'INSÉREZ pas. Si vous essayez d'ajouter cette ligne, vous devez lui donner une autre, ID unique ou vous devez supprimer le pré-existante de la ligne en premier. Laquelle de ces est la bonne réponse dépend de ce que votre application est en train de faire.
OriginalL'auteur Gabe Sechan
Essayez de vérifier si l'ID est déjà existé. Si la valeur est true, n'insérez pas, parce que vous avez déjà la ligne avec cet ID.
OriginalL'auteur Kai Wang
Mon erreur a été, j'ai essayé de combler
ID
colonne si elle a été déjà définies comme unINTEGER PRIMARY KEY AUTOINCREMENT
OriginalL'auteur Sam
faire de colonne id id integer autoincrement, et ne mettez pas la valeur de l'id dans les valeurs de contenu.
OriginalL'auteur Vickie Kangare
J'ai d'abord mis la nouvelle contrainte unique enfant de l'ancien. Au lieu de cela assurez-vous que vous êtes actuelle colonne unique est d'abord:
OriginalL'auteur Hannah Louisa Carney
J'ai eu le même problème et le problème c'est que j'ai oublié d'ajouter
db.execSQL(YOUR_TABLE);
dans monDbHelper
OriginalL'auteur EAMax