【问题标题】:Update ID field in SQLite database when an entry is removed删除条目时更新 SQLite 数据库中的 ID 字段
【发布时间】:2016-01-28 19:53:47
【问题描述】:

我的 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 字段更好的替代方法?

【问题讨论】:

  • 数据在列表中是如何显示的?我的意思是您是否以任何方式对其进行排序?
  • 你为什么用的是职位而不是ID?
  • @TeChNo_DeViL 我按照从数据库接收到的顺序显示它
  • @CL 因为没有0 id字段,所以数据库以ID 1开头

标签: java android database sqlite


【解决方案1】:

最好简单重置你的身份列,你可以参考这个问题:SQL Server Reset Identity Increment for all tables

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 2013-04-01
      • 1970-01-01
      • 2012-10-15
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多