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

时间:2015-07-16 21:45:40

标签: android sqlite

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:12)

感谢CommonsWare关于apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { applicationId "com.tanmaykulkarni.appname" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' compile 'com.android.support:design:22.2.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'de.hdodenhof:circleimageview:2.0.0' compile 'com.facebook.android:facebook-android-sdk:4.7.0' compile 'com.parse.bolts:bolts-android:1.3.0' compile 'com.parse:parse-android:1.12.0' compile 'com.parse:parsefacebookutils-v4-android:1.10.4@aar' } 一词,所以我通过导航这些类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); } CommonsWare提到的大小:

sCursorWindowSize

由于我当前的版本为sCursorWindowSize = Resources.getSystem().getInteger( com.android.internal.R.integer.config_cursorWindowSize) * 1024; ,因此Android SDK 23.0.1的值为2048.这意味着2MB。我没有其他版本的SDK可供检查。

答案 2 :(得分:3)

Cursor不包含内存中的所有结果,但它确实具有返回查询的总计数(通过getCount)。当你迭代结果时,它会获取条目(我猜不是一个接一个,但可能是块状)。我很确定在这个级别上有优化。一旦你完成它,你必须关闭它 - 否则为什么系统会在查询完成后保持打开状态。