让我们假设我有一个包含列的表,例如:
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 address
和 level
,并查找两个参数值相同的记录 . 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
}
<<<<<
2 回答
其中 your_table 是相应的表名 .
Note 如果级别为负(根据示例数据),那么BETWEEN首先需要最低值,因此它将是
BETWEEN -61 AND -59
.注意上面假设MAC地址存储在一列中(如果不是则不能完成,除非mac地址可以与列相关) .
假设最佳LEVEL最低,因此-1优于-60(如果不是则使用ASC而不是DESC)
再次 your_table , your_mac_address_column , the_mac_address_value 和 the_rssi_value 将相应地替换为实际值(请注意,字符串应使用单引号) .
要在列LEVEL中获得最接近值为60的3行:
对于问题的第2部分,您应该提供表格的示例数据 .
编辑:
从您发布的示例数据中我看不到列
RSSI
,但如果它存在于表中,那么SELECT
语句就可以了 .将
rawQuery()
的第二个参数更改为:因为
level
是int .在
onReceive()
中,您使用myDb
. 我不知道你是如何初始化它的 .如果应用程序崩溃,您必须复制日志,标识问题的部分并将其发布 .