我想通过缓存名称对呼叫日志进行排序。缓存的名称可以为null。 因此,对于空缓存名称,我希望获得别名的电话号码。
在sqlite中,有ifnull()函数。 ifnull details
我试试:
String[] projections = new String[] { Calls._ID, Calls.NUMBER, Calls.DATE, Calls.TYPE, Calls.DURATION, "ifnull("+Calls.CACHED_NAME+","+Calls.NUMBER+") as display_name" };
Cursor cursor_call = ctx.getContentResolver().query(URI_CALL_LOGS,
projections,
null,
null,
null);
但是我使用ifnull时出错了,我找不到这个函数的样本。
java.lang.IllegalArgumentException:无效的列ifnull(name,number)as display_name
答案 0 :(得分:1)
由于您创建查询的方式,括号之类的内容正在自动转义以防止SQL注入攻击。
在您可以直接访问原始数据库(而不是通过contentProvider)的情况下,您可以使用SQLiteDatabase.rawQuery,如下所示:
myDB.rawquery(“select * from a,b where a.id = b.someid”,null);
但在这种情况下,您似乎想要访问联系人应用程序的call_log数据库,您只能通过提供的ContentResolver来访问该数据库。因为它有意设计为只允许您将值而不是SQL命令作为变量发送,所以ifnull(...)不起作用,并且当您从中提取数据时,您需要使用逻辑在名称和数字之间进行选择光标。