Android SQLite查询是否懒惰地执行?

时间:2014-03-16 15:18:55

标签: android sqlite android-sqlite lazy-evaluation android-cursor

我刚遇到一些奇怪的事。说我有一张桌子

_id | caption
 1  | foo

我直接在SQLite中执行以下查询:

select _id, (caption != "bar") as caption from the_table;

我得到(预期)输出:

_id | caption
 1  | 1

然而执行此代码:

// This will execute the EXACT SAME query (checked via debugger)
Cursor affected = db.query(table, (String[]) projection.toArray(new String[0]), selection, selectionArgs, null, null, null); 
// ############ UPDATE ROW 1 TO CAPTION=bar #######
int result = db.update(table, values, selection, selectionArgs);

affected.moveToPosition(-1);        
while (affected.moveToNext()) {
    long id = affected.getLong(0); // We made the _id column the first in the projection
    for (int i = 1; i < affected.getColumnCount(); i++) {
        Log.d("xyz", affected.getInt(i) + "");
    }
}

得到我:&#34; xyz 0&#34;在LogCat中。

光标是否在第一次光标访问时懒惰地执行查询?

如果我在查询后插入affected.getCount()似乎有效。

1 个答案:

答案 0 :(得分:1)

是的,有漏洞的抽象。

单独查询转换为prepare调用,将SQL编译为sqlite程序(想想字节码)。该程序未运行。

要运行已编译的sqlite程序,可以使用step,它返回结果行,完成状态代码或错误。在Android中,您可以通过调用返回游标上的moveTo...()方法之一来有效地运行程序。

sqlite C API不直接支持获取游标数。 Android implements它通过运行查询并将结果存储在“光标窗口”缓冲区中。稍后使用相同的缓冲区来访问光标的数据。