删除条目时更新SQLite数据库中的ID字段

时间:2016-01-28 19:53:48

标签: java android database sqlite

我的android应用程序中有一个SQLite数据库,它包含多个用户名/密码条目,这些内容被放入ListView。

我想要实现的是,当项目被长按时,它会从列表中删除,但我遇到了问题。

我使用以下代码从数据库中删除条目:

    public void deleteEntry(int ID) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_LOGINS, KEY_ID + " = ?",
            new String[]{Integer.toString(ID)});
    db.close();
    }

数据以下列方式存储在数据库中:

--------------------------
1|server|username|password
2|server|username|password
3|server|username|password
4|server|username|password
--------------------------

现在,如果我要将条目#2标记为删除,我最终将使用以下内容

--------------------------
1|server|username|password
3|server|username|password
4|server|username|password
--------------------------

导致尝试访问其他条目的问题,因为我使用第一个字段执行所有查找。使用我的OnItemLongClickListener中的位置,如果我按下列表中的第二项,它将搜索ID为2的项目。

如何更新数据库中的条目,以便我的ID字段将按顺序编号?是否有更好的替代方法来使用ID字段?

2 个答案:

答案 0 :(得分:0)

最好只是重置您的标识列,您可以参考以下问题:SQL Server Reset Identity Increment for all tables

请注意,依赖于所有列的增量是非常糟糕的做法,我建议您将数据库中的每一行链接到程序中的一行,以便在加载时,从数据库中选择每个项目并为其创建一行在你的程序中,这消除了这个问题。

答案 1 :(得分:0)

我可以建议一个简单的改变。

加载列表时(如果您正在使用CursorLoader),请维护已加载的ID列表。这可以通过声明一个全局ArrayList<Integer>来保存已加载字段的ID来实现。现在使用onLongItemClicked或类似方法,您可以使用get(position)对象上的ArrayList<Integer>方法使用ID从数据库中删除行,以获取行项目当前持有的ID 。最后从数据库中删除后,也从ArrayList中删除ID,然后就可以进行另一轮删除了。