首页 文章

使用Android Studio的SQLite,返回由2个参数选择的所有记录

提问于
浏览
0

让我们假设我有一个包含列的表,例如:

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

大约有5000条记录具有相同的 SSID ,略有不同的 BSSIDLEVEL 值 . 我的设备正在扫描最近的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
}
<<<<<

2 回答

  • 0

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

    SELECT * FROM your_table WHERE level BETWEEN 59 AND 61;
    
    • 其中 your_table 是相应的表名 .

    • Note 如果级别为负(根据示例数据),那么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 将相应地替换为实际值(请注意,字符串应使用单引号) .

  • 0

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

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

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

    编辑:
    从您发布的示例数据中我看不到列 RSSI ,但如果它存在于表中,那么 SELECT 语句就可以了 .
    rawQuery() 的第二个参数更改为:

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

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

相关问题