ContentResolver.query () がカーソル オブジェクトではなく null を返すのはどのような状況ですか? 以前に空のカーソルを取得したことがありますが、メソッドが null を返すこともあることに気付きました。ただし、これが発生する状況を追跡することはできませんでした。
6 に答える
今日受け取ったアプリのユーザー クラッシュ レポートが原因で、同じ問題に遭遇しました。Android のドキュメントで不明な点がある場合は、ソース コードを確認すると役立ちます。ContentResolver.query()
これは、返品の原因について私が見つけたものですnull
。
コンテンツ プロバイダを取得できません。これは、指定された に問題がある
Uri
か、単にシステムに存在しないことが原因である可能性があります。Uri に問題がある場合、原因は次のとおりです。プロトコルがないcontent://
か、Uri に権限文字列部分がありません (Uri.getAuthority() == null)。取得したプロバイダーのクエリ メソッド自体が を返します
null
。コンテンツ プロバイダーを取得できましたが、クエリ中にRemoteExceptionがスローされました。
null
特に (2.) のために、ルールが定義されていないため、結果として何が原因になるかはかなり恣意的です。しかし、通常、SQLite が のバックエンドであるContentProvider
場合、結果として だけではなく、少なくともいくつかの空の Cursor オブジェクトが期待できますnull
。
Android システムContentProvider
は、何かを返す前にいくつかのチェックを行います。入力が期待どおりでない場合、null
返される可能性はほとんどありません。しかし、正直なところ、それは以前の私には起こりませんでした。通常IllegalArgumentException
、クエリ パラメータの問題が発生した場合に発生します。null
空の結果セットの場合、一部の ContentProvider 実装が返される可能性があります。
どちらにしても。null を常にチェックする必要があるようです。特に理由番号 (3.) は、おそらくどの Android デバイスでも発生する可能性があります。
ContentResolver.query
content://
URI スキームが形式でない場合、またはcontentProvider
スキーム自体の が存在しない場合は、null を返します。
ContentResolver.query() は、次の場合に null を返します。
データベースに存在しない列名を渡そうとした場合 (非常に一般的なケースは、列に似ているため、開発者が定数を列名として使用する場合です)。
URI 引数が無効なため、null になる可能性があります。
null を返す場合は他にもあるかもしれません。ただし、上記の2つのケースは、開発者が髪を引っ張る非常に一般的な理由です:)
結果がない場合は、nullを返します。つまり、指定されたデータベースクエリの結果が何も起こらない場合(データの1行も)、query()はnullを返します。