Android SQLite游标是否一次将所有记录加载到内存中?

Jul*_* A. 11 sqlite android

Android SQLite游标是否将查询的所有数据加载到内存中,还是某种优化策略是其实现的一部分?

Com*_*are 13

SQLiteCursor当您浏览数据时,A会填充数据的"窗口".我的回忆是窗口大小是1MB,但我不能指出你备份回忆的特定代码.因此,对于小型查询,SQLiteCursor一旦开始访问行和列,其结果就是将整个结果集保存在内存中.

  • 在SDK 23.0.1中。2MB。请查看我的答案 (2认同)
  • 内存限制后会发生什么?游标是否需要返回并从UI线程读取数据库以获取更多数据? (2认同)

hqt*_*hqt 13

感谢CommonsWare关于Window术语,所以我通过导航这些课程再次颠倒了Android SQLiteCursor -> AbstractWindowedCursor -> CursorWindow.这是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);
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,CommonsWare提到sCursorWindowSize的大小是:

sCursorWindowSize = Resources.getSystem().getInteger(
                com.android.internal.R.integer.config_cursorWindowSize) * 1024;
Run Code Online (Sandbox Code Playgroud)

我目前的版本是Android SDK 23.0.1,值为com.android.internal.R.integer.config_cursorWindowSize2048.这意味着2MB.我没有其他版本的SDK用于检查.

  • 感谢一些优秀而有用的研究! (2认同)