如何在游标对象保持第一行并移动以获取第二行时中断游标处理?
Posted
技术标签:
【中文标题】如何在游标对象保持第一行并移动以获取第二行时中断游标处理?【英文标题】:How to break cursor processing while cursor object hold first row and move to fetch second row? 【发布时间】:2012-09-25 19:14:40 【问题描述】:由于我只从 SqlLite 数据库中获取一列,但在我的游标对象中获取了超过 1MB 的数据,因此我无法拆分我的数据库查询。一旦游标获取第一行并且在那个特定时间我想将此游标对象值保存在另一个对象中,是否可以中断游标处理。在该游标清除此值并移动到下一个以获取数据库中的第二行之后,这会一直持续到记录结束?
【问题讨论】:
你从这么大的列中获取什么样的数据?是一团吗? 据我了解,您正在寻找游标的传统行为(PL/SQL 游标“单程票”,int sqlite3_step()
)。对?看,对于当前设备10-20M的缓存游标数据是没有问题的。您可以使用 3party 库来避免这种内存“滥用”吗?
如何设置fetch
的大小?
【参考方案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();
【讨论】:
>>因为我从 SqLite 数据库中获取 只有一个 列,但获得了超过 1MB 的数据 你的意思是你的表只有一列?我的意思是获取所有没有blob的行(只有一个原语有一个较小的Cursor),然后一个接一个地获取所有的blob(每次释放资源)...... @ra,对不起,我以为你是 Manish。让我们看看他怎么说 结果集和表格有时不一样 @Manish,你觉得我的想法怎么样?先只获取 id,然后按 id 获取,获取关联的 blob 并释放游标。【参考方案2】:如果您正在使用 Cursor(SQLiteCursor) - 在您获取第一行后,无法防止游标“吃掉内存”(如您所说的中断处理)。android.database.sqlite
是一个 java 包装器用于用 C 编写的 sqlite3 库。
事实是 sqlite3 没有计算语句将产生多少记录的功能,因此您必须在 sqlite3_step
函数的帮助下扫描整个结果集,直到它返回 SQLITE3_DONE
。 SQLiteCursor
派生自 CursorWindow
。
CursorWindow
(有一些本地方法)目前 Cursors
getCount()
方法是第一次调用 - 它做两件事:计算行数并缓存这些行。
有custom port(russian) 的sqlite3 for android 具有您需要的功能。
如果您看不懂俄语:java code native code native sources
【讨论】:
以上是关于如何在游标对象保持第一行并移动以获取第二行时中断游标处理?的主要内容,如果未能解决你的问题,请参考以下文章