即使删除后,如何确保我的主键值没有间隙?

时间:2014-06-24 00:18:50

标签: 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

这是我的代码:

    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();
    }

我该怎么办?

1 个答案:

答案 0 :(得分:1)

删除密钥时,需要将所有大于1的值重新编号。如果这听起来很昂贵,那就是因为它。 BTW您还必须重新编号对这些ID的所有引用。

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

通常最简单的解决方案是不更改ID,因为他们不需要花费任何空白或创建新ID。然而,对它们进行重新编号是昂贵且难以正确的。