我正在使用带有SQLite数据库的Android应用程序。
我有一个名为REMINDER的表(有2列:REMINDER_ID和REMINDER_VALUE),我允许用户删除该表中的任何记录。由于需要解释的原因,我需要REMINDER_ID列始终具有序列号。因此,如果用户删除第2行,我需要消除该间隙,因此第3行变为第2行,第4行变为第3行,等等。
我在DBHelper类中编写了一个方法,每当删除一行时都会对db进行更新,但我不确定这是否是最好的方法。
以下是从REMINDER表中删除行的方法。正如您所看到的,在删除行之前,我会检查它是否是最后一行,因为如果是,我不必费心更新ID。
public void deleteReminder(int reminder_id){
SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "SELECT MAX(" + COLUMN_REMINDER_ID + ") FROM " + REMINDERS_TABLE;
Cursor cursor = db.rawQuery(selectQuery, null);
int maxId = cursor.getInt(cursor.getColumnIndex(COLUMN_REMINDER_ID));
db.delete(REMINDERS_TABLE, COLUMN_REMINDER_ID + "= ?", new String[] {String.valueOf(reminder_id)});
if (reminder_id != maxId){
updateRemindersIds();
}
cursor.close();
db.close();
}
这是用于更新ID的方法:
public void updateRemindersIds(){
SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "SELECT * FROM " + REMINDERS_TABLE;
Cursor cursor = db.rawQuery(selectQuery, null);
ContentValues values = new ContentValues();
int new_id = 1;
if(cursor.moveToFirst()){
do{
values.put(COLUMN_REMINDER_ID, new_id);
int old_id = cursor.getInt(cursor.getColumnIndex(COLUMN_REMINDER_ID));
db.update(REMINDERS_TABLE, values, COLUMN_REMINDER_ID + "= ?", new String[] {String.valueOf(old_id)});
new_id++;
} while (cursor.moveToNext());
}
}
}
我还没有达到测试它的程度,但即使它有效,我也想知道是否有更好的方法可以做到这一点?我的理由是因为我没有太多的经验。
谢谢
编辑:创建一个实现Joachim Isaksson解决方案的方法:
public void updateRemindersIds(){
SQLiteDatabase db = this.getWritableDatabase();
String updateQuery = "UPDATE " + REMINDERS_TABLE + " SET " + COLUMN_REMINDER_ID + " = (" +
"SELECT COUNT(*) + 1 FROM " + REMINDERS_TABLE + " r " +
"WHERE " + REMINDERS_TABLE + "." + COLUMN_REMINDER_ID + "> r." + COLUMN_REMINDER_ID + ")";
db.execSQL(updateQuery);
db.close();
}
我认为这对Android / Java / SQLite来说是正确的吗?
答案 0 :(得分:1)
只要他们有唯一的提醒ID,您就可以使用一次更新对项目重新编号;
UPDATE reminders SET reminder_id = (
SELECT COUNT(*)+1
FROM reminders r
WHERE reminders.reminder_id>r.reminder_id
);