如何修复sqlite查询错误在哪里?没有被选择参数取代

时间:2019-04-09 17:26:08

标签: android sqlite

我的应用是一本字典,现在我正在努力使其可离线使用。数据库已下载,现在我们无法连接互联网。我需要使用本地数据库。我得到了可读的数据库,然后设置了一个查询。在我自己的测试电话上,一切正常。但是现在在发布更新之前,我在另外两部手机上尝试了一下,只是看到了?选择中的值不会替换为selectionArgs中的值。

调试器仅显示sql语句是在不替换选择内容的情况下构建的。

它可以在Android 8.1上的手机上使用,但是当两款手机的手机位置较低时,它就停止工作了,我没主意了。

我还尝试将其更改为db.rawQuery(),但结果相同。

    String selection = "eng LIKE ? OR oky LIKE ? OR engpl LIKE ? OR okypl LIKE ? OR engcom LIKE ? OR okycom LIKE ? OR Alternative LIKE ?";
    String[] selectionArgs = {term, term, term, term, com, com, term};
    String orderBy = "eng, oky ASC";
    Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, orderBy);

现在,我希望结果能够为我提供与用户搜索的单词(术语)相匹配的术语,但光标却是空的,因为没有包含问号的术语。

尤其令人困惑的是,它只能在一部手机上使用,而不能在其他手机上使用。

1 个答案:

答案 0 :(得分:0)

调试器不会显示已解析的?,因为用C而不是Java的基础SDK(sqlite实现)完成了对?的替换。

您可以看到的最好的是bindArgs例如对于以下代码:-

    csr = mDBhlpr.getWritableDatabase().query("table1",null,"id=?",new String[]{"1"},null,null,null);
    while (csr.moveToNext()) {
        long id = csr.getLong(csr.getColumnIndex(DBHelper.COL_TABLE1_ID));
    }

在第一行有一个断点,那么您可以得到:-

enter image description here

我认为问题不在于参数的绑定,而在于其他地方。您可以通过更改:-

进行测试
Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, orderBy);

收件人

Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, null, null, null, null, null);
DatabaseUtils.dumpCursor(cursor);

即选择所有行,然后将游标中的所有行写入日志。

如果仍然不存在,则其他设备上的表为空。 如果发生异常,则必须对此进行调查。

如果这按预期工作,则逐步(一个接一个)添加选择条件和参数。

例如首先是

 String selection = "eng LIKE ?";
    String[] selectionArgs = {term};
    String orderBy = "eng, oky ASC";
    Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null, null);

然后:-

String selection = "eng LIKE ? OR oky LIKE ?";
String[] selectionArgs = {term, term};
String orderBy = "eng, oky ASC";
Cursor cursor = db.query(DictionaryContract.WordEntry.TABLE_NAME, null, selection, selectionArgs, null, null,null);

,依此类推(请注意,最后再添加订单)。

如果上述方法均无效,则您的问题(按预期)在其他地方。