我刚遇到一些奇怪的事。说我有一张桌子
_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()
似乎有效。
答案 0 :(得分:1)
是的,有漏洞的抽象。
单独查询转换为prepare调用,将SQL编译为sqlite程序(想想字节码)。该程序未运行。
要运行已编译的sqlite程序,可以使用step,它返回结果行,完成状态代码或错误。在Android中,您可以通过调用返回游标上的moveTo...()
方法之一来有效地运行程序。
sqlite C API不直接支持获取游标数。 Android implements它通过运行查询并将结果存储在“光标窗口”缓冲区中。稍后使用相同的缓冲区来访问光标的数据。