我的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字段?
答案 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,然后就可以进行另一轮删除了。