0

キャッシュされた名前で通話記録を並べ替えたいのですが。キャッシュされた名前はnullにすることができます。したがって、キャッシュされた名前がnullの場合、エイリアスの電話番号が必要です。

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:display_nameとして無効な列ifnull(name、number)

4

1 に答える 1

1

クエリの作成方法が原因で、SQLインジェクション攻撃を防ぐために、括弧などが自動エスケープされています。

(contentProviderを介さずに)raw DBに直接アクセスできる状況では、次のように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 に答える