2012-10-26 18 views

答えて

55

私は私のアプリのために今日受け取ったユーザークラッシュレポートのために同じ問題を偶然見つけました。 Androidのドキュメントに何かが不明な場合は、ソースコードを調べるのに役立ちます。

  1. コンテンツプロバイダが取得することができません。これは私がContentResolver.query()nullを返すの原因について見つけたものです。これは指定されたUriの問題が原因である可能性があります。単にシステムに存在しないためです。 Uriが問題の場合は、プロトコルがcontent://でないか、Uriに権限文字列部分(Uri.getAuthority()== null)がありません。

  2. 取得したプロバイダのquery method自体がnullを返します。

  3. コンテンツプロバイダーを取得できましたが、クエリ中にRemoteExceptionがスローされました。特に理由は(2)の

それが定義された規則がないので、結果としてnullの原因が何であるかはかなり任意です。しかし、通常、SQLiteがContentProviderのバックエンドである場合、nullではなく、空のCursorオブジェクトが少なくとも一部は結果として期待できます。

AndroidシステムContentProvider何かを返す前にいくつかのチェックを行います。入力が期待どおりでない場合、nullが返される可能性は低いです。しかし、正直言って、それは以前に私に起こったことはありませんでした。クエリパラメータの問題が発生した場合、通常はIllegalArgumentExceptionとなります。空の結果セットの場合には、ContentProviderの実装によってはnullが返されることがあります。

いずれにしても。 は常にnullを確認する必要があるようです。特に理由番号(3.)はおそらく、どのAndroid搭載端末でも起こり得るものです。

+0

非常にまれに起こると思われるもの(ケース3)のために、私たちは常にヌルをチェックする必要があります。 – RestInPeace

+0

私の場合、リンクは 'content:// XXX'の代わりに' contnet:// XXX'でしたが、dammit –

-2

結果がない場合はnullを返します。私は、指定されたデータベースクエリが何も結果を出さない場合(つまり、単一のデータ行でもない場合)、query()はnullを返します。

+1

私は前に空のカーソルオブジェクトを取得していたと思ったが、私は間違っている可能性があります...これは半正式な場所で書かれたのを見ましたか? – Salis

+0

私はいつもテストデータを持っていました。 – Charan

+0

結果がない場合は "null"を返しません。空のカーソルだけを返します。 – efeyc

5

ContentResolver.queryは、URIスキームの形式がcontent://ではない場合、またはスキーム自体のcontentProviderが存在しない場合はnullを返します。

3

ContentResolver.query()は次の場合にはnullを返します。

  1. あなたがデータベースに存在しないカラム名を渡すしようとした場合(開発者が使用するときに非常に一般的な場合がありますカラムはカラムに似ているので、カラム名は です)。

  2. あなたのURI引数が無効であるため、nullになる可能性があります。

それはnullを返しますする他の例があるかもしれません。しかし、上記の2つのケースは非常に一般的な理由は、開発者が彼らの毛を引っ張る:)

1

マニフェストでプロバイダを宣言するのを忘れた場合、クエリはnullを返す可能性があります。

2

私は同じ問題を抱えていました。私の不具合はプロバイダのCursorを閉じないようにしたので、後のクエリ呼び出しがnullにつながった。

+0

これはこれです。カーソルを閉じないと、その後のクエリが機能しない場合があります(結果として、URIがnullとして返されます)。 私はこれを1時間ほど座って、これを見ました。 +1 – DJO

関連する問題