因为我只从 SqLite 数据库中获取一列,但在我的游标对象中获取了超过 1MB 的数据,我无法拆分我的数据库查询。一旦游标获取第一行并且在那个特定时间我想将此游标对象值保存在另一个对象中,是否可以中断游标处理。在该游标清除此值并移动到下一个以获取数据库中的第二行之后,这会一直持续到记录结束吗?
问问题
1181 次
2 回答
1
如果您正在使用 Cursor(SQLiteCursor) - 在您获取第一行后,无法阻止游标“吃掉内存”(如您所说的中断处理)。
android.database.sqlite
是用 C 编写的 sqlite3 库的 java 包装器。
事实是 sqlite3 没有函数来计算将产生多少记录语句,因此您必须在sqlite3_step
函数的帮助下扫描整个结果集,直到它返回SQLITE3_DONE
。SQLiteCursor
源自CursorWindow
。
CursorWindow
(有一些本机方法)目前Cursors
getCount()
第一次调用方法 - 它做两件事:计算行数并缓存这些行。
有用于 android 的 sqlite3 的
自定义端口(俄语) ,具有您需要的功能。
如果看不懂俄语:
java代码
本机代码
本机源
于 2012-10-09T19:17:06.847 回答
1
如果您执行以下操作会怎样?(这只是一个想法)仅使用 id 列获取您需要的所有行(获取 id 而不是 blob 列)。迭代抛出该游标,并为每一行使用您的 blob 获取给定 id 的一行。然后关闭该 Cursor 并为下一个 id 行打开一个新的:
//just fetch the ids of the wanted rows
Cursor idCursor = db.query("TABLE_NAME",new String[]{"_id"}, null, null, null,null,null);
Cursor blobCursor;
//for each row (id)
while(idCursor.moveToNext())
{
//fetch one row with the blob of the given id
blobCursor = db.query("TABLE_NAME",new String[]{"image"}, "_id = ?", new String[] {new Long(idCursor.getLong(0)).toString()}, null,null,null);
if(blobCursor.moveToFirst())
{
//get the blob and store it
blobCursor.getBlob(0);
}
blobCursor.close(); //close the cursor (and release resources)
}
idCursor.close();
于 2012-10-10T07:52:50.763 回答