我的应用是一本字典,现在我正在努力使其可离线使用。数据库已下载,现在我们无法连接互联网。我需要使用本地数据库。我得到了可读的数据库,然后设置了一个查询。在我自己的测试电话上,一切正常。但是现在在发布更新之前,我在另外两部手机上尝试了一下,只是看到了?选择中的值不会替换为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);
现在,我希望结果能够为我提供与用户搜索的单词(术语)相匹配的术语,但光标却是空的,因为没有包含问号的术语。
尤其令人困惑的是,它只能在一部手机上使用,而不能在其他手机上使用。
答案 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));
}
在第一行有一个断点,那么您可以得到:-
我认为问题不在于参数的绑定,而在于其他地方。您可以通过更改:-
进行测试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);
,依此类推(请注意,最后再添加订单)。
如果上述方法均无效,则您的问题(按预期)在其他地方。