我正在尝试在SQLite中保存没有重复的记录,但是即使UNIQUE()也无济于事。
在这里我创建数据库,并希望cityName是唯一的:
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table " + tableName + "(" + KEY_ID + "integer primary key autoincrement,"
+ cityName + " text," + cityTemp + " text, " + " UNIQUE(" + cityName +"))");
}
以及存储在数据库中的函数:
public void saveWeather(Response<CurrentWeather> response) {
contentValues = new ContentValues();
database = dbHelper.getWritableDatabase();
contentValues.put(DBHelper.cityName, response.body().getCityName());
contentValues.put(DBHelper.cityTemp,
response.body().getForecastMain().getTemp());
database.insert(DBHelper.tableName, null, contentValues);
}
我希望没有重复,但可以重复
答案 0 :(得分:1)
您必须跟踪是否已插入元素。插入新元素后,ID(模型的变量)将为-1。如果元素已插入,则ID将增加1。这样,您将更新有条目的表,并在需要时插入新条目。
if (I.getId() == -1) { //models ID which would be increamented by one once the element is inserted
database.insert(DBHelper.tableName, null, contentValues);
} else { // otherwise, update
database.update(DBHelper.tableName, contentValues
DBHelper.tableName.KEY_ID + " = ?", new String[]{String.valueOf(I.getId())});
}
答案 1 :(得分:1)
您的问题归因于 onCreate 方法的运行方式。
它在数据库的生存期内仅自动运行一次。因此,对创建SQL所做的任何架构更改都不会自动应用。
开发典型的解决方法是删除数据库或使用onUpgrade方法(如果它删除了表并重新创建表)(通常通过调用onCreate)。可以通过删除/清除应用程序数据,卸载应用程序或通过设备资源管理器来删除数据库。
如果您需要保留现有数据,则要复杂一些。