最近在修改公司的老项目,项目中对于通讯录的内容进行了查询操作,之前一直都运行的很正常,突然这两天出现了运行crash或者无法查询到正确信息,甚至无法查询到信息的问题,最终通过两个问题的修改,发现了共同点
其问题虽然错误现象不同,但报错信息几乎一致
在crash中报错信息为"invalid token LIMIT",而在无法查询到通讯录的信息中报错信息则为"invalid token deleted",
经最终确认发现:该类问题的错误信息主要是在代码的调用过程中,查询数据库时,使用了sql语句,且sql语句中包含了String字符串的拼接,而“limit”、“deleted”字符已经无法在R版本后被识别,无法直接拼接,因此导致sql语句查询报错,从而引发了后续的错误信息
修改方案如下:以limit为例
原始的报错的代码如下:
Uri uri = Uri.withAppendedPath(Calls.CONTENT_FILTER_URI,
Uri.encode(normalizedNumber));
String orderByAndLimit = Calls.DATE + " DESC LIMIT " + mMaxToRetrieve;
Cursor cursor = getContext().getContentResolver().query(uri, null, null, null,
orderByAndLimit);
修改后的正确的代码如下:
Uri uri = Uri.withAppendedPath(Calls.CONTENT_FILTER_URI,
Uri.encode(normalizedNumber))
.buildUpon()
.appendQueryParameter(Calls.LIMIT_PARAM_KEY, mMaxToRetrieve + "")
.build();
String orderByAndLimit = Calls.DATE + " DESC";
Cursor cursor = getContext().getContentResolver().query(uri, null, null, null,
orderByAndLimit);
结论:问题并不复杂,且修改方式也并不复杂,但目前还是没搞明白为什么不能如此拼接关键字,也算是一个遗留问题,后续解决
遗留问题:为什么不能使用limit等关键字了?还有其他的关键字是否可以使用?为什么?不能使用这些关键字的原因(初衷)是什么?