【问题标题】: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;
}