android - 遍历 SQLite 表的行以更新 ID

标签 android sqlite cursor

我正在使用 SQLite 数据库开发 Android 应用。

我有一个名为 REMINDER 的表(包含 2 列:REMINDER_ID 和 REMINDER_VALUE),我允许用户从该表中删除任何记录。出于需要解释的原因,我需要 REMINDER_ID 列始终具有序号。因此,如果用户删除第 2 行,我需要消除该间隙,因此第 3 行变为第 2 行,第 4 行变为第 3 行,等等。

我在我的 DBHelper 类中写了一个方法来在删除行时更新数据库,但我不确定这是否是最好的方法。

下面是从 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 来说是正确的吗?

最佳答案

只要它们具有唯一的提醒 ID,您就可以使用一次更新对项目重新编号;

UPDATE reminders SET reminder_id = (
  SELECT COUNT(*)+1
  FROM reminders r
  WHERE reminders.reminder_id>r.reminder_id
);

An SQLfiddle to test with .

关于android - 遍历 SQLite 表的行以更新 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22900328/

相关文章:

android - 如何停止ListView的PullToRefresh动画

java - 哪些 HttpURLConnection 方法适合重试 Twitter?

android - 链接到 droid fu jar 或帮助安装它?

java - SQLite识别长值

sql - 为 SQLite 创建触发器,当插入新记录时,删除旧记录

python - 如何在 Python 代码中使用 postgres 游标

Android - Activity 层次结构(后退按钮)

java - Android中解析嵌套的Json对象并存储在数据库中

java - SQLite数据库 ListView

css - 调整 CSS 自定义鼠标光标的大小