Android SQLite游标是否会将查询的所有数据加载到内存中,还是某种优化策略是其实现的一部分?
答案 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)。当你迭代结果时,它会获取条目(我猜不是一个接一个,但可能是块状)。我很确定在这个级别上有优化。一旦你完成它,你必须关闭它 - 否则为什么系统会在查询完成后保持打开状态。