如何在查询后选择数据库中新行的位置?

时间:2016-06-01 08:38:17

标签: android sqlite android-recyclerview

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

在recycleler视图中,我建议在那种情况下调用notifyItemInserted(int position),并在新项目的游标中使用位置含义位置。

我知道有两件事我可以做:

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

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

  3. 我的问题是是否可以执行一个类似这样的SQL查询:

    1. 查询我想要的内容

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

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

    4. 获取位置

    5. 的光标

      奖金问题:这个问题还有其他解决办法吗?如何找到我在光标中知道的新项目的位置?

2 个答案:

答案 0 :(得分:0)

对SQLite的insertupdate的调用按文档返回

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

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

答案 1 :(得分:0)

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

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应用程序正在使用的规模上是有效的,并且明智的主人说除非测试显示出问题,否则不会优化某些内容。