Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 迭代SQLite表的行以更新ID_Android_Sqlite_Cursor - Fatal编程技术网

Android 迭代SQLite表的行以更新ID

Android 迭代SQLite表的行以更新ID,android,sqlite,cursor,Android,Sqlite,Cursor,我正在开发一个带有SQLite数据库的Android应用程序 我有一个名为“提醒”的表(有两列:提醒ID和提醒值),我允许用户从该表中删除任何记录。出于一些需要解释的原因,我需要提醒ID列始终具有序列号。因此,如果用户删除第2行,我需要消除该间隙,因此第3行变成第2行,第4行变成第3行,以此类推 我在DBHelper类中编写了一个方法,用于在删除行时更新数据库,但我不确定这是否是最好的方法 下面是从提醒表中删除行的方法。如您所见,在删除该行之前,我会检查它是否是最后一行,因为如果是最后一行,我就

我正在开发一个带有SQLite数据库的Android应用程序

我有一个名为“提醒”的表(有两列:提醒ID和提醒值),我允许用户从该表中删除任何记录。出于一些需要解释的原因,我需要提醒ID列始终具有序列号。因此,如果用户删除第2行,我需要消除该间隙,因此第3行变成第2行,第4行变成第3行,以此类推

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

下面是从提醒表中删除行的方法。如您所见,在删除该行之前,我会检查它是否是最后一行,因为如果是最后一行,我就不必麻烦更新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
);

.

看起来不错。我试图为它创建方法,并编辑了上面的答案。对吗?