0

假设我有一个包含以下列的表:

ID    SSID      BSSID      RSSI
1     abcd     hs:hd:sd    -60
2     abcd     hs:hd:po    -68

大约有 5000 条记录具有相同的SSID、略有不同BSSID的值和LEVEL值。我的设备正在扫描最近的 WiFi 网络环境,因此我知道它们的 MAC 地址和 RSSI 级别。我选择具有最高 od RSSI 值的 3。

首先,我想知道是否可以通过数据库搜索以获取LEVEL值等于或接近的所有记录60,例如59,58,61

其次,有没有办法查询数据库以返回与 3 最佳扫描结果具有相同 MAC 地址和 RSSI 值的所有记录?如果是这样,该查询会是什么样子?

编辑:感谢所有的答案。我现在要做的是将3次扫描与存储在数据库中的记录进行比较getRequiredData。我想将 2 个参数传递给该函数,mac addresslevel为两个参数查找具有相同值的记录。rawQuery 似乎很好,代码正在编译,但应用程序在第一次扫描时崩溃。我找不到原因,是我获取这些参数的逻辑错误还是与查询有关?

public Cursor getRequiredData(String mac, int level){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("SELECT BSSID, RSSI FROM TABLE_NAME WHERE BSSID =? AND RSSI=?", new String[] {mac, level});
    return res;
}

扫描部分:

class WifiReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        sb = new StringBuilder();
        Comparator<ScanResult> comparator = new Comparator<ScanResult>() {
            @Override
            public int compare(ScanResult o1, ScanResult o2) {
                return (o1.level>o2.level ? -1 : (o1.level==o2.level ? 0 : 1));
            }
        };
        lista = wifiManager.getScanResults();
        Collections.sort(lista, comparator);
        for (int i = 0; i < lista.size(); i++) {
            scanResult = wifiManager.getScanResults().get(i);
                sb.append(new Integer(i + 1).toString() + ". " + (lista.get(i)).SSID + "  " + (lista.get(i)).BSSID + "  " + (lista.get(i)).level + "\n");
                boolean isInserted = myDb.insertData(lista.get(i).SSID.toString(), lista.get(i).BSSID.toString(), lista.get(i).level);
                if (isInserted = true)
                    Toast.makeText(MainActivity.this, "Data inserted", Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(MainActivity.this, "Data not inserted", Toast.LENGTH_LONG).show();
        }
        for (int i=0; i<4; i++)
        {
            scanResult = wifiManager.getScanResults().get(i);
            match = myDb.getRequiredData(lista.get(i).BSSID.toString(), lista.get(i).level);
        }
        Log.i("match values: ", DatabaseUtils.dumpCursorToString(match));
        txt.setText(sb);
        wifiManager.startScan();
    }
}

以下是match包含的内容:

2018-12-10 16:36:26.334 13347-13347/com.example.maciek.wifiscann I/match values:: >>>>> Dumping cursor android.database.sqlite.SQLiteCursor@e1a86d1
0 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
1 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
2 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
3 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
4 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
5 {
   BSSID=f4:c5:ed:5c:s6:20
   RSSI=-69
}
<<<<<
4

2 回答 2

0

首先我想知道是否可以搜索数据库以获取 LEVEL 值等于或接近 60 的所有记录,例如 59、58、61。

SELECT * FROM your_table WHERE level BETWEEN 59 AND 61;
  • 其中your_table是相应的表名。
  • 请注意,如果级别为负(根据示例数据),则 BETWEEN 首先需要最低值,因此它将是BETWEEN -61 AND -59

其次,有没有办法查询数据库以返回与 3 最佳扫描结果具有相同 MAC 地址和 RSSI 值的所有记录?如果是这样,该查询会是什么样子?

SELECT * FROM your_table WHERE your_mac_address_column = 'the_mac_address_value' AND RSSI = 'the_rssi_value' ORDER BY LEVEL DESC LIMIT 3
  • 请注意,上述假设 MAC 地址存储在列中(如果不是,则除非 MAC 地址可以与列相关联,否则无法完成)。
  • 假设最佳 LEVEL 最低,因此 -1 优于 -60(如果不是,则使用 ASC 而不是 DESC)
  • 同样your_tableyour_mac_address_columnthe_mac_address_valuethe_rssi_value将相应地替换为实际值(注意字符串应该用单引号括起来)。
于 2018-12-09T23:56:48.153 回答
0

要在 LEVEL 列中获得最接近 60 的 3 行:

SELECT * FROM tablename ORDER BY ABS(LEVEL - 60), LEVEL LIMIT 3

对于问题的第二部分,您应该提供表格的示例数据。

编辑:
从您发布的示例数据中,我没有看到一列RSSI,但如果它存在于表中,则该SELECT语句是可以的。
将第二个参数更改rawQuery()为:

new String[] {mac, String.valueOf(level)}

因为level是int。
onReceive()你使用myDb. 不知道你是怎么初始化的。
如果应用程序崩溃,您必须复制日志,识别问题的部分并将其发布。

于 2018-12-10T08:20:14.933 回答