唯一约束失败: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;

}

}

如何解决呢?

回答:

您的代码可能违反了KEY_ID字段上主键的唯一性约束。

两种可能的解决方案是:

  1. 确保您EventData.getId()为每个对象返回唯一值。现在,我看不到您将任何标识符传递给其构造函数,并且可能所有事件都以相同的id值插入。
  2. 如果您不希望自己生成ID,则可以将AUTOINCREMENT设置添加到KEY_ID列定义中。这样,KEY_ID字段将自动填充,并且每一行都有其自己的唯一值。一旦出现,不要忘记删除添加KEY_IDContentValues自己。

以上是 唯一约束失败:sqlite数据库:android 的全部内容, 来源链接: utcz.com/qa/424858.html

回到顶部