1

Androidアプリケーション用のコンテンツプロバイダーを作成していますが、UriMatacherを使用してURIを正しく一致させるのに問題があります。

たとえば、一致するURIを追加します(リンクから抜粋)

sURIMatcher.addURI("content://com.example", "people", PEOPLE);
sURIMatcher.addURI("content://com.example", "people/#", PEOPLE_ID);
sURIMatcher.addURI("content://com.example", "people/#/phones", PEOPLE_PHONES);

次に、にアクセスしてみますcontacts/people/1/phones。成功した一致は、PEOPLE_IDの代わりにとなることになりPEOPLE_PHONESます。

クエリは、最初はこのコードによって生成されます。

Uri uri = Uri.parse("content://com.example/people/#/phones");
ContentUris.appendId(uri.buildUpon(), 1).build();

いくつかのロギングステートメントがスローされると、次のことがわかります。

クエリに渡されたURIはこれを与えます:

content://com.example/people/1#/phones

しかしこれuri.getPath()を与える:

/people/1

uriの3番目のパス部分は明らかに削除されています。これは、間違ったuriと一致していた理由を説明しています。

Android開発者のWebサイトの例は、これに問題がないことを示しているようです。URIを間違って作成していますか?ただのバグですか?これは意図された機能ですか(したがって、Android開発者の例は悪いものです)?

4

1 に答える 1

3

Uri.parse()UriMatcherワイルドカードを認識していません。ここで、#はURIのフラグメント識別子であるため、解析すると+フラグメントcontent://com.example/people/#/phonesになります。IDがURIの最後に正しく追加された後、フラグメントが引き継がれます。この場合、信頼することはできませんが、長い道のりでURIを構築する必要があります。content://com.example/people/phonesContentUris

                path = new Uri.Builder()
                .scheme( ContentResolver.SCHEME_CONTENT )
                .authority( DataProvider.AUTHORITY )
                .appendPath( "people" )
                .appendPath( "1" )
                .appendPath( "phones" ) ).build();
于 2013-02-14T06:13:05.440 に答える