同じSQLiteデータベースの2つの異なるテーブルで動作する2つのコンテンツプロバイダーを作成しました。それらは、 AliSerghiniの投稿で説明されているようにSQLiteOpenHelper
の単一のインスタンスを共有します。各コンテンツプロバイダーは以下のように登録されています。AndroidManifest.xml
<provider
android:name=".contentprovider.PostsContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
android:multiprocess="true" >
</provider>
<provider
android:name=".contentprovider.CommentsContentProvider"
android:authorities="com.example.myapp.provider"
android:exported="false"
android:multiprocess="true" >
</provider>
各コンテンツプロバイダーは、必要なコンテンツURIを定義し、を提供しますUriMatcher
。
public class PostsProvider extends BaseContentProvider {
private static final UriMatcher sUriMatcher = buildUriMatcher();
private static final int POSTS = 100;
private static final int POST_ID = 101;
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = CustomContract.CONTENT_AUTHORITY;
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS, POSTS);
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_POSTS + "/#", POST_ID);
return matcher;
}
..。
public class CommentsProvider extends BaseContentProvider {
protected static final UriMatcher sUriMatcher = buildUriMatcher();
protected static final int COMMENTS = 200;
protected static final int COMMENT_ID = 201;
private static UriMatcher buildUriMatcher() {
final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
final String authority = CustomContract.CONTENT_AUTHORITY;
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_COMMENTS, COMMENTS);
matcher.addURI(authority, DatabaseProperties.TABLE_NAME_COMMENTS + "/#", COMMENT_ID);
return matcher;
}
コンテンツリゾルバーを呼び出して投稿を挿入すると、PostsContentProvider
がターゲットになります。ただし、コメントを挿入しようとすると、コンテンツリゾルバーは期待どおりに参照せずCommentsContentProvider
、を呼び出しますPostsContentProvider
。結果は、私がスローする次の例外PostsContentProvider
です。
UnsupportedOperationException: Unknown URI: content://com.example.myapp.provider/comments
現在コンテンツプロバイダーに登録されている利用可能なすべてのコンテンツURIを出力することは可能ですか?