从SQLite数据库缓存查询有哪些方法?

时间:2015-08-04 18:48:16

标签: android performance sqlite

我正在开发以下功能:
用户选择日期并获取ListView填充SimpleCoursorLoader(查询在后台执行)。
用户经常选择相邻日期,可能会有很多重复的查询 我测试了应用程序并发现在高频请求的情况下 - 它运行得很慢 为了加速我的应用程序,我决定实现缓存,其中将存储查询结果。关键 - 日期和价值 - ?
值得做,你能提出什么技巧?

2 个答案:

答案 0 :(得分:0)

我发现MatrixCursor对于缓存非常有用。我保留了HashMap 逻辑:如果没有请求 - 发出它,获取Cursor,将其转换为MatrixCursor并写入缓存。

以下是转换代码段:

private MatrixCursor cursorToMatrixCursor(Cursor c) {
        MatrixCursor result = new MatrixCursor(c.getColumnNames());
        if (c.moveToFirst()) {
            do {
                ArrayList<String> columnValues = new ArrayList<>();
                final int nOfColumns = c.getColumnCount();
                for(int col = 0; col < nOfColumns; ++col)
                    columnValues.add(c.getString(col));
                result.addRow(columnValues);
            } while (c.moveToNext());
        }
        return result;
    }

答案 1 :(得分:0)

1)是的,由于数据库访问速度相对较慢(即使是像SQLite这样的好东西),这真的值得做。

2)考虑到我从你的帖子得到的内容我建议使用LongSparseArray密钥将是数据库中的约会日期(long), 存储值 - 您的缓存数据对象(Bundle等)。
原因是:

  • 自然分类
  • 在更改时维护排序顺序
  • 快速
  • 记忆效率

3)当您需要加载重叠/相邻间隔时,您必须检查边界并仅加载缺少部分

4)如果在缓存非相邻间隔时可能出现这种情况 - 您还需要管理加载的间隔范围。但是如果你只为列表滚动目的而这样做,你可以省略它(如果你不停止在fling手势上加载数据)

关于我的经验:我使用缓存获得了大约3倍的回报。但实际结果取决于数据库方案等。您可能会得到更多