一个长的IN子句与Android上的SQLite中的大量查询

时间:2014-03-12 07:42:29

标签: android performance sqlite android-contentprovider

我有一张列入黑名单的蓝牙设备表,需要确保我的设备没有配对。列入黑名单的设备存储在通过内容提供商访问的数据库中。

哪种方法更好?

  • 我构建了一个IN子句,然后查询一次数据。 IN子句可能包含很多值。例如。

SELECT _id FROM blacklisted_devices WHERE mac_address IN ('01:23:45:67:89:ab', ' ab:23:45:67:89:df') OR device_name IN ('Lorem', 'Ipsum')

  • 我在其中使用for循环和查询数据。

    Set<BluetoothDevice> bondedDevices = BluetoothAdapter.getDefaultAdapter().getBondedDevices();
    Cursor cursor = null;
    for (BluetoothDevice device : bondedDevices) {
        cursor = getContentResolver().query(Uris.BLUETOOTH,
                new String[] { Columns._ID },
                Columns.DEVICE_NAME + "=? OR " + Columns.MAC_ADDRESS + "=?",
                new String[] { device.getName(), device.getAddress() },
                null);
        if (cursor.getCount() > 0) {
            // Unpair
        }
    }
    

1 个答案:

答案 0 :(得分:1)

如果要检查的值列表存储在与黑名单表相同的数据库中,那么最快最简单的方法是直接比较它们:

SELECT _id
FROM blacklisted_devices
WHERE mac_address IN (SELECT mac_address FROM my_list)
      ...

但是,这不是这种情况;如果您有权访问数据库,则不需要内容解析器。

将多个值与IN子句进行比较要快得多。 只要您不超过database limits中的一个,这应该是首选。