Android SQLite:有效地多次运行具有不同参数的同一查询

时间:2015-06-25 12:37:50

标签: java android database performance sqlite

我的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

所有这些例子都会在一定程度上起作用,但它们都有陷阱。不知怎的,我觉得我错过了解决这个问题的方法,因此问题是:

执行此类查询的正确方法是什么?

谢谢。

1 个答案:

答案 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中可用。

请尝试以下几点:

  1. 使用选择参数进行常规查询。

  2. 假设默认光标工厂,将结果SQLiteCursor投射到setSelectionArgs()

  3. 访问您需要的行。

  4. 使用requery()

  5. 更新选择参数
  6. update mytable set IsEditable = 1 - IsEditable;

  7. 转到3除非完成