我的os.RDWR
数据库中有一个表格:
种:
SQLite
我从服务器收到一个id列表,我想只显示与我收到的ID相对应的物种。
现在我知道几个选项:
1 即可。这样做的显而易见和天真的方式是:
_id | species | description
---------------------------
1 | Aardvark | Some description for Aardvark
2 | Aardwolf | Some description for Aardwolf
3 | Caracal | Some description for Caracal
这将执行太多的操作,我假设有多个小的“磁盘”读取,这将非常慢。
2 即可。另一个选择是使用SQLiteStatement,但这只返回一个值,这对我的示例和shouldn't really be used for queries无效。
第3 即可。另一个选择是手动将条件连接到原始SQLiteDatabase db = this.openDatabase();
for (int id : idList) {
Cursor cursorSpecies = db.query(true, TABLE_SPECIES, new String[] {COL_SPECIES_SPECIES},
COL_ID + "=?", id, null, null, null, null);
cursorSpecies.moveToNext();
speciesList.add(cursorSpecies.getString(0));
cursorSpecies.close();
}
查询中,类似于:
SQL
所有这些例子都会在一定程度上起作用,但它们都有陷阱。不知怎的,我觉得我错过了解决这个问题的方法,因此问题是:
执行此类查询的正确方法是什么?
谢谢。
答案 0 :(得分:1)
对于问题中的特殊情况,请仅考虑WHERE id IN (x,y,z, ...)
。
要解决标题中的问题,而不仅仅是问题正文中的特殊情况:
Android SQLite API在这方面的用途不是很多。
在原始sqlite3 C API中,可以通过单个sqlite3_prepare*()
调用来获取sqlite3_statement
并将参数绑定到位sqlite3_step()
以获取行,然后重置使用新参数绑定重用它的语句。
在Android API中,语句对应于Cursor
,步进相当于移动光标。重置和重新绑定功能仅在requery()
setSelectionArguments()
和Cursor
中可用。
请尝试以下几点:
使用选择参数进行常规查询。
假设默认光标工厂,将结果SQLiteCursor
投射到setSelectionArgs()
。
访问您需要的行。
使用requery()
update mytable set IsEditable = 1 - IsEditable;
转到3除非完成