【问题标题】:How to select position of new row in database after query?查询后如何在数据库中选择新行的位置?
【发布时间】:2016-06-01 08:38:16
【问题描述】:

我正在使用回收器视图来显示带有过滤器、排序等的表格内容。添加新项目时,我插入新项目,使用 SELECT 和排序查询数据库以获取新游标。

在回收站视图中,建议我在这种情况下调用 notifyItemInserted(int position),位置表示新项目光标中的位置。

我知道我可以做两件事:

  1. 迭代光标并找到项目的位置(如果我的表丢失了行,女巫可能不是最好的主意)

  2. 不要 notifyItemInserted,而是 notifyDataSetChanged 并且没有漂亮的动画(像野人一样)

我的问题是是否可以执行如下的 sql 查询:

  1. 查询我想要的内容

  2. 添加 COLUMN_POSITION 枚举上一个查询的结果(在内存中)

  3. 使用 select COLUMN_POSITION 查询上述内容,其中 id = 新项目的 id。

  4. 获取带位置的光标

额外问题:这个问题还有其他解决方案吗?如何在光标中找到我知道的新项目的位置?

【问题讨论】:

  • 使用CursorJoiner查看两个Cursors的区别
  • 您应该将此添加为答案。虽然它并不完美,因为它需要通过我提供的唯一键按升序对游标进行排序,但无论如何它可能是我得到的最好的。

标签: android sqlite android-recyclerview


【解决方案1】:

根据文档,在 SQLite 上对 insertupdate 的调用会返回,

 * @return the row ID of the newly inserted row, or -1 if an error occurred

所以你只需要返回这个,你就会知道你的行,并且可以使用notifyItemInserted

【讨论】:

  • 并非如此。正如我在问题中所说的(也许我不清楚这一点),我显示带有排序的查询结果,因此它不太可能的行 ID 将匹配光标的位置。
【解决方案2】:

我终于得出结论,这个想法是不必要的复杂,实际上迭代光标就足够了。

CursorJoiner 在内部,但将游标与更多限制性行为进行比较。如果您想使用降序或没有唯一列,则行为未定义,因此您很不走运。

/**
 * @return position of new item or -1 if item could not be found inside the cursor
 */
private int getNewItemPosition(@NonNull Cursor cursor, @NonNull Tag dao) {
    int idColumn = cursor.getColumnIndexOrThrow(TagDao.Properties.Id.columnName);
    long newDaoId = dao.getId();
    while (cursor.moveToNext()) {
        if (newDaoId == cursor.getLong(idColumn)) {
            return cursor.getPosition();
        }
    }
    return -1;
}

我最初对性能的反对并没有证明至少在 android 应用程序正在使用的规模上是有效的,而且正如明智的大师所说,除非测试表明存在问题,否则不要优化某些东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2019-01-06
    • 2023-01-18
    相关资源
    最近更新 更多