【发布时间】:2011-05-12 23:36:36
【问题描述】:
boolean android.database.Cursor.moveToNext() 文档说:
http://developer.android.com/reference/android/database/Cursor.html#moveToNext%28%29
将光标移动到下一行。
如果光标已经超过结果集中的最后一个条目,此方法将返回 false。
但是,我的书说要从光标中提取数据:
光标 myCursor = myDatabase.query(...); if (myCursor.moveToFirst()) { 做 { int 值 = myCursor.getInt(VALUE_COL); // 使用值 } 而 (myCursor.moveToNext()); }谁是对的?这两个都不可能是真的。如果您看不到矛盾,想象 myCursor 从查询返回 1 行。第一次调用 getInt() 将起作用,但随后 moveToNext() 将返回 true,因为它不是“已经”超过结果集中的最后一个条目。所以现在光标将超过最后一个条目,第二次调用 getInt() 将做一些未定义的事情。
我怀疑文档有误,应该改为:
如果光标“已经位于”结果集中的最后一个条目,则此方法将返回 false。
在 moveToNext() 方法返回 false 之前,光标是否必须已经 PAST(而不是 AT)最后一个条目?
请不要打蛇
【问题讨论】:
-
我认为如果您只使用 myCursor.moveToNext(),您会将它放在 while 循环的开头,例如 while(myCursor.moveToNext()){...}。你从第一个位置开始,所以没有矛盾。
-
这本书的作者不同意你的方法。他们声称您需要 if(myCursor.moveToFirst()) 结果集为空的情况。如果您从 MoveToNext() 开始,则光标的位置未定义,您的代码将始终失败。
-
我猜他可能是对的。我只是快速搜索了我的代码,实际上我总是先执行 movetofirst 然后执行 do{}while() 循环。仍然不一定意味着矛盾 - 它可能是光标甚至没有定义起始位置,直到您移动到特定条目(第一个或其他)。
-
我认为你错过了矛盾。作者声称,如果您是“AT”最后一个条目,则可以测试 moveToNext() 的结果,如果为真,则与文档的声明相矛盾,如果“已经过去”,它将返回 false。