0

我想按缓存名称对通话记录进行排序。缓存的名称可以为空。因此,在缓存名称为空的情况下,我希望获得别名的电话号码。

在 sqlite 中,有 ifnull() 函数。 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(name,number) as display_name

4

1 回答 1

1

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

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

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

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

于 2012-09-13T21:02:53.270 回答