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

时间:2012-09-13 20:21:00

标签: android sqlite android-contentprovider calllog ifnull

我想通过缓存名称对呼叫日志进行排序。缓存的名称可以为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

1 个答案:

答案 0 :(得分:1)

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

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

myDB.rawquery(“select * from a,b where a.id = b.someid”,null);

但在这种情况下,您似乎想要访问联系人应用程序的call_log数据库,您只能通过提供的ContentResolver来访问该数据库。因为它有意设计为只允许您将值而不是SQL命令作为变量发送,所以ifnull(...)不起作用,并且当您从中提取数据时,您需要使用逻辑在名称和数字之间进行选择光标。