Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Java 如何确保主键值中没有间隙,即使在删除之后也是如此?_Java_Android_Sql_Database - Fatal编程技术网

Java 如何确保主键值中没有间隙,即使在删除之后也是如此?

Java 如何确保主键值中没有间隙,即使在删除之后也是如此?,java,android,sql,database,Java,Android,Sql,Database,我正在从数据库表中删除一些行。然后我想更新其他行的ID 例如,这是我的表格: id | name 1 | aaaa 2 | bbbb 3 | cccc 4 | dddd 现在我删除第3行。我想要一张这样的桌子: id | name 1 | aaaa 2 | bbbb 3 | dddd 但我得到这张桌子: id | name 1 | aaaa 2 | bbbb 4 | dddd 这是我的代码: Spars

我正在从数据库表中删除一些行。然后我想更新其他行的ID

例如,这是我的表格:

id |   name
1  |   aaaa
2  |   bbbb 
3  |   cccc 
4  |   dddd
现在我删除第3行。我想要一张这样的桌子:

id |   name
1  |   aaaa
2  |   bbbb 
3  |   dddd
但我得到这张桌子:

id |   name
1  |   aaaa
2  |   bbbb 
4  |   dddd
这是我的代码:

    SparseBooleanArray checkedItemPositions = getListView()
        .getCheckedItemPositions(); 
    int itemCount = getListView().getCount();
    int[] tab = new int[itemCount];

    for (int i = itemCount - 1; i >= 0; i--) {

        tab[i] = itemCount - i;

        if (checkedItemPositions.get(i)) { 
            adapter.remove(list.get(i));
            db.deleteMyPlace(new MyPlacesTable(tab[i]));

        }

    }
以及删除方法

public void deleteMyPlace(MyPlacesTable myPlace) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_MY_PLACES, KEY_ID + " = ?",
                new String[] { String.valueOf(myPlace.getID()) });
        db.close();
    }

我能做什么?

删除键时,需要将大于该键的所有值减少一,从而重新编号。如果这听起来很贵,那是因为它很贵。顺便说一句,您还必须重新编号对这些ID的所有引用

另一种成本较低的方法是将最后一个条目移动到已删除的条目。这减少了需要更改的条目的数量,但更新的复杂性和要更改的表的数量是相同的


通常最简单的解决方案是不更改ID,因为它们不需要花费任何东西来创建空白或新的ID。然而,重新编号它们既昂贵又棘手。

为什么ID必须没有间隙?通常情况下,数据ID永远不会更改。你为什么不在代码中这样做呢?循环浏览您的项目并在其中编号。
id
列的全部目的是作为每行的唯一不可变标识符。为什么要这样做?Ommiting id如何删除该行?