Android-如果存在,则按缓存名称对调用进行排序(在sqlite中使用ifnull)

Android-如果存在,则按缓存名称对调用进行排序(在sqlite中使用ifnull),android,sqlite,android-contentprovider,calllog,ifnull,Android,Sqlite,Android Contentprovider,Calllog,Ifnull,我想按缓存的名称对调用日志进行排序。缓存的名称可以为空。 因此,如果缓存的名称为空,我希望获得别名的电话号码 在sqlite中,有一个ifnull()函数。 我尝试: String[] projections = new String[] { Calls._ID, Calls.NUMBER, Calls.DATE, Calls.TYPE, Calls.DURATION, "ifnull("+Calls.CACHED_NAME+","+Calls.NUMBER+") as display_nam

我想按缓存的名称对调用日志进行排序。缓存的名称可以为空。 因此,如果缓存的名称为空,我希望获得别名的电话号码

在sqlite中,有一个ifnull()函数。

我尝试:

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(名称、编号)显示为\u name

由于创建查询的方式,括号之类的内容会自动转义以防止SQL注入攻击

在您可以直接访问原始数据库(而不是通过contentProvider)的情况下,您可以使用,例如:

myDB.rawquery(“从a,b中选择*其中a.id=b.someid”,null)


但在本例中,您似乎希望访问联系人应用程序的call_log数据库,这只能通过提供的ContentResolver实现。由于它有意设计为只允许您发送值,而不允许将SQL命令作为变量发送,因此ifnull(…)不起作用,当您从光标中提取数据时,您需要使用逻辑在名称和数字之间进行选择。

编辑问题以包含来自Logcat的错误消息?