【问题标题】:What are ways to cache queries from SQLite database?有哪些方法可以缓存 SQLite 数据库中的查询?
【发布时间】:2015-08-04 18:48:15
【问题描述】:

我正在开发以下功能:
用户选择一个日期并获得由SimpleCoursorLoader 填充的ListView(查询在后台执行)。
用户经常选择相邻的日期,可能会有很多重复的查询。
我测试了应用程序,发现在高频请求的情况下 - 它运行非常缓慢。
为了加快我的应用程序的速度,我决定实现将存储查询结果的缓存。键-日期和值-?
是否值得做,您可以建议哪些技术?

【问题讨论】:

    标签: android performance sqlite


    【解决方案1】:

    1) 是的,因为 DB 访问速度相对较慢(即使使用 SQLite 之类的好东西),这确实值得做

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

    • 自然排序
    • 在更改时保持排序顺序
    • 快速
    • 内存高效

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

    4) 如果在缓存 非相邻 间隔时可能出现这种情况 - 您还需要管理加载的间隔边界。但是,如果您仅出于列表滚动目的而这样做,则可以省略此操作(如果您不停止在滑动手势上加载数据)

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

    【讨论】:

      【解决方案2】:

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

      这里是转换的sn-p:

      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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多