1

我遇到了一个Cursor名为的方法moveToPrevious()

我之前读过一篇文章,该文章建议实现C SQLite step 命令的向后版本是困难的/不可能的:

...请求一个 sqlite3_step_backward() 按钮真的就像期望您的符号调试器能够向后运行或“撤消”其执行回到上一个断点。没有人合理地期望调试器能够做到这一点,所以你也不应该期望 SQLite 能够 sqlite3_step_backward() 。

  • Android 游标是 SQLite 的包装器还是某种独立的实现?
  • 他们是如何做出这个 moveToPrevious 命令的?
4

2 回答 2

2

游标接口提供对数据库查询返回的结果集的随机读写访问。游标实现不需要同步,因此使用来自多个线程的游标的代码应该在使用游标时执行自己的同步。

游标:在 Android 中从 SQLite 数据库中检索数据是使用游标完成的。Android SQLite 查询方法返回一个包含查询结果的 Cursor 对象。Cursors 将查询结果记录存储在行中,并授予许多方法来访问和遍历记录。要使用 Cursors,必须导入 android.database.Cursor。

http://developer.android.com/reference/android/database/Cursor.html

在这里检查源

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/database/Cursor.java/

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/database/AbstractCursor.java/

查看链接中的第 248 行

248 public final boolean moveToPrevious() {
249        return moveToPosition(mPos - 1); 
         // mPos looks like is the index here which is an int
250    }

移动到位置

195      public final boolean moveToPosition(int position) {
196        // Make sure position is not past the end of the cursor
197        final int count = getCount();
198        if (position >= count) {
199            mPos = count;
200            return false;
201        }
202
203        // Make sure position isn't before the beginning of the cursor
204        if (position < 0) {
205            mPos = -1;
206            return false;
207        }
208
209        // Check for no-op moves, and skip the rest of the work for them
210        if (position == mPos) {
211            return true;
212        }

getCount()

返回游标在行集中的当前位置。该值从零开始。当第一次返回行集时,光标将位于位置 -1,即第一行之前。返回最后一行后,再次调用 next() 将使光标离开最后一个条目,位于 count() 的位置。

返回: 当前光标位置。

于 2013-07-01T16:08:51.417 回答
2

AndroidCursor类确实先将所有结果记录读入内存,然后允许您随机单步执行它们。

(这就是游标中的数据有 1 MB 限制的原因。)

于 2013-07-01T17:09:44.327 回答