java - Android SQLite : Running the Same Query with Different Parameters Multiple Times Efficiently

标签 java android database performance sqlite

我的 SQLite 数据库中有一个表:

物种:

_id  |  species  |  description 
---------------------------
  1  |  Aardvark |  Some description for Aardvark
  2  |  Aardwolf |  Some description for Aardwolf
  3  |  Caracal  |  Some description for Caracal

我从服务器收到一个 ID 列表,我只想显示与我收到的 ID 相对应的物种。

现在我知道了一些选择:

1。这样做的明显而幼稚的方法是:

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();
}

这将执行太多的操作,并且我假设多个小的“磁盘”读取,这会非常慢。

2。另一种选择是使用 SQLiteStatement但这只返回一个值,这对我的示例和 shouldn't really be used for queries 不起作用无论如何。

3。另一种选择是手动将条件连接到原始 SQL 查询中,大致如下:

SQLiteDatabase db = this.openDatabase();
String query = "SELECT * FROM " + TABLE_SPECIES + " WHERE ";
for (int id : idList) {
    query += COL_ID + "=" + id + " OR ";
}
// I am aware this will end in an " OR" but this is not the point of this example so please ignore it.
Cursor cursorSpecies  = db.rawQuery(query, null);
// Use the cursor and close it.

While this should work decently well, a very large query would probably break some query string length limit so this is not ideal either.

所有这些示例都在一定程度上有效,但它们都有缺陷。不知何故,我觉得我缺少解决方案,因此问题是:

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

谢谢。

最佳答案

对于问题中的特殊情况,只需考虑WHERE id IN (x,y,z, ...)

要解决标题中的问题,而不仅仅是问题正文中的特殊情况:

Android SQLite API 在这方面并不是很通用。

在原始 sqlite3 C API 中,可以通过单个 sqlite3_prepare*() 调用来获取 sqlite3_statement 并将参数绑定(bind)到位,sqlite3_step( ) 获取行,然后重置语句以将其与新参数绑定(bind)一起重用。

在Android API中,该语句对应于一个Cursor,步进相当于移动光标。重置和重新绑定(bind)功能仅在 SQLiteCursor 中可用。如requery()setSelectionArguments()

因此尝试按照以下方式进行操作:

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

  2. 假设使用默认游标工厂,将生成的 Cursor 转换为 SQLiteCursor

  3. 访问您需要的行。

  4. 使用 setSelectionArgs() 更新选择参数

  5. requery()

  6. 除非完成,否则转到 3

关于java - Android SQLite : Running the Same Query with Different Parameters Multiple Times Efficiently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050657/

相关文章:

android - 为什么要使用strings.xml?

database - 简单密码加密

mysql - 插入从内部联接查询派生的数据时出错

Java:如何将CLOB插入到oracle数据库中

java - Drools 规则模板 - 第一次调用比后续调用慢 1000 倍

java - Java 中的 Class<?> 是什么意思?

java - 我们可以在 Java 的字节数组中存储的最大元素数量是多少?

java.lang.UnsatisfiedLinkError : Native method not found: Error in jni() 错误

android - 在 fragment 中动态添加 TextView

mysql - 一个表可以有两个外键吗?