Android SQLite游标是否将查询的所有数据加载到内存中,或者是否有某种优化策略作为其实现的一部分?
发布于 2015-07-16 22:00:20
当您浏览“窗口”时,SQLiteCursor会用它填充“窗口”。我记得窗口大小是1MB,但我不能指出备份该回忆的特定代码。因此,对于小型查询,一旦开始访问行和列,SQLiteCursor就会将整个结果集保存在内存中。
发布于 2016-01-26 11:37:38
感谢CommonsWare关于Window术语的介绍,所以我通过导航这些类SQLiteCursor -> AbstractWindowedCursor -> CursorWindow再次逆转了Android。下面是CursorWindow构造函数:
public CursorWindow(String name) {
mStartPos = 0;
mName = name != null && name.length() != 0 ? name : "<unnamed>";
if (sCursorWindowSize < 0) {
/** The cursor window size. resource xml file specifies the value in kB.
* convert it to bytes here by multiplying with 1024.
*/
sCursorWindowSize = Resources.getSystem().getInteger(
com.android.internal.R.integer.config_cursorWindowSize) * 1024;
}
mWindowPtr = nativeCreate(mName, sCursorWindowSize);
if (mWindowPtr == 0) {
throw new CursorWindowAllocationException("Cursor window allocation of " +
(sCursorWindowSize / 1024) + " kb failed. " + printStats());
}
mCloseGuard.open("close");
recordNewWindow(Binder.getCallingPid(), mWindowPtr);
}如您所见,sCursorWindowSize是CommonsWare提到的大小:
sCursorWindowSize = Resources.getSystem().getInteger(
com.android.internal.R.integer.config_cursorWindowSize) * 1024;因为我现在的版本是Android SDK 23.0.1,所以com.android.internal.R.integer.config_cursorWindowSize的值是2048。意思是2MB。我没有另一个版本的SDK来检查。
发布于 2015-07-16 21:52:20
游标并不包含内存中的所有结果,但它有返回查询的总数(通过getCount)。当您迭代结果时,它会获取条目(我猜不是一个接一个,但可能是块)。我很确定在这个级别上有优化。一旦您完成了它,您必须关闭它-否则,为什么系统将保持打开后,查询已经完成。
https://stackoverflow.com/questions/31465069
复制相似问题