【问题标题】:Why do Android Cursors start before the first row of results, and end after the last row?为什么 Android 游标在第一行结果之前开始,在最后一行之后结束?
【发布时间】:2012-07-13 22:37:03
【问题描述】:

我试图理解为什么他们会在一行中的第一个位置之前开始光标,以及为什么它会在最后一个位置之后结束。这样做有继承优势吗?

例如:

public abstract int getPosition () 

自:API 级别 1 返回游标在行集中的当前位置。该值从零开始。当第一次返回行集时,光标将位于位置 -1,即第一行之前。在最后一行返回后,另一个调用 下一个() 将使光标离开最后一个条目,位于 计数()。

返回 当前光标位置。

谢谢。

【问题讨论】:

    标签: android sqlite android-cursor


    【解决方案1】:

    因为不能保证Cursor 会填充行。如果您从包含 0 行的数据库返回 Cursor,则初始位置为 0 没有意义,因为位置 0 处没有行。

    【讨论】:

    • 为什么这没有意义?如果游标有 3 行,并且您已使用 while (c.moveToNext()) 遍历它们,那么它将位于 3,即没有行的位置。为什么空光标上的初始位置不应该遵循相同的模式? (你可能是对的,我只是想理解其中的逻辑。)
    • 因为否则光标将处于不确定状态。如果位置 '0' 可能意味着它是空的或存在一行,那么它将会是模棱两可的。光标下使用的迭代器不能位于位置0,因为没有位置0。在您的示例中,光标永远不会将其位置显示为3。它会失败试图从 2 移动到 3,因此停留在 2 并退出循环。
    • 我的最后一点是错误的。它确实显示位置 3。我唯一的猜测是与逻辑开头保持一致。 -1 是游标的逻辑起点,count() 是游标的逻辑终点。我无法对其进行测试,但通过检查源代码,我猜想在空光标上调用 moveToNext() 也会显示它位于位置 0,这将是逻辑结束。
    • “因为否则光标将处于不确定状态。如果位置 '0' 可能意味着它是空的或存在一行,则它会是模棱两可的。”仅仅因为该位置没有告诉您行数并不意味着游标处于不确定状态。位置 -1 也同样模棱两可:它不会告诉您光标是空的还是有一行。
    • 告诉你这些事情不是它的目的。它的目的是标记光标的逻辑开始。它是一个非位置,仅用于指示迭代器已被初始化或重置。
    【解决方案2】:

    所以你可以这样做:

    Cursor c = db.rawQuery(...);
    while (c.moveToNext()) {
        // deal with one row at a time
    }
    

    这是迄今为止迭代游标结果的最简洁的方法(请参阅What's the best way to iterate an Android Cursor?),如果它没有在第一行之前开始,它将无法工作。

    【讨论】:

    • 抱歉,这纯属偶然。我同意使用while (c.moveToNext()) {...} 是最简洁的做事方式,也是我一直这样做的方式,但我不相信这就是为什么Cursor 总是位于第一行之前的原因。正如 Jason 所说,Cursor 可能会在没有结果的情况下返回,因此它必须位于“中性”位置。此外,假设开发人员希望将Cursor 返回的集合设置为行集中的任何绝对位置(第一个、最后一个、介于两者之间的某个位置等),这不是任何查询引擎的业务。
    • OP 询问了优势,我认为这是优势 - 因此是一个有效的答案。
    【解决方案3】:

    Android SQLiteCursor 是原生 SQLite 数据库游标的包装对象,它是一种控制结构,可让您遍历数据库中的记录。
    我假设,在调用 setPositionmoveToFirst 本地游标之前,甚至不会将查询结果加载到内存以节省空间。

    【讨论】:

    • 那么您的意思是,当您调用moveToFirst()setPosition() 时,光标会继续并加载查询结果(无需等待getString() 或其他直接数据访问)?
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多