主にアプリケーション間でデータを共有するためのAndroidのContentProvider四つの成分の一つとして。より一般的な開発は、オペレーティングシステムgetContentResolverマルチメディアデータベース(MediaProvider)の使用です。本論文では、のContentProviderおよび注意事項をカスタマイズする方法について説明します。
カスタムSimpleContentProvider.java、ContentProviderのは、継承されました。
コードは以下の通りであります:
パブリック クラス SimpleContentProvider 拡張のContentProviderを{ プライベート 静的な 最終文字列タグ=「SimpleContentProvider」; // 使用している場合、一致UriMatcher.NO_MATCH(-1)を返し プライベート 静的 最終 UriMatcherのMatcher = 新新UriMatcher(UriMatcher.NO_MATCH); プライベート 静的 最終 int型の CODE_NOPARAM = 1; // 引数ない // コード一致 プライベート 静的 最終 INT CODE_PARAM = 2; // パラメータ 静的 { //URIは、比類のない操作を一致させるために待ってcom.test.providers.SimpleContentProvider / articalフォーマット遵守しなければなりません //が一致CODE_NOPARAM、不一致リターン-1が返さ MATCHER.addURI(「com.test.providers.SimpleContentProvider」、「Artical」を、 CODE_NOPARAM); // #はcom.test.providers.SimpleContentProvider / Artical / 10数表し //が一致CODE_PARAM、不一致リターン-1が返さ MATCHER.addURI( "com.test.providers.SimpleContentProvider"、 "Artical /#"を、 CODE_PARAM); } プライベート dBOpenHelper dbOpenHelper; // データベース操作 プライベート 最終文字列ARTICAL_TABLE = "Artical" 。 @Override パブリック ブールのonCreate(){ //自動生成されたメソッドスタブTODO dbOpenHelper = 新しい新しいDBOpenHelper(のgetContext()); 戻り trueに; } @Override 公共ウリINSERT(URI URIは、CV ContentValues){ // TODO自動生成方法スタブ Log.i(TAG、「INSERT( ) " ); SQLiteDatabase DB = dbOpenHelper.getWritableDatabase(); スイッチ(MATCHER.match(URI)){ ケースCODE_NOPARAM: ロング ID = db.insert(ARTICAL_TABLE、ヌル、CV); // 主キーが増分である場合、次いで主キーの値を返し、そうでない場合、行番号 ウリinsertUri = ContentUris.withAppendedId(URI、ID)。 返すinsertUriを。 デフォルト: スロー 新しい、IllegalArgumentExceptionを( "これはunknow URIです:" + URI)。 } } @Override 公共 INT 削除(URIのURI、ストリング選択、文字列[] selectionArgs){ // TODO自動生成方法スタブ Log.i(TAG、 "削除()" )。 SQLiteDatabase DB = dbOpenHelper.getWritableDatabase()。 スイッチ(MATCHER.match(URI)){ ケースCODE_NOPARAM。 戻り db.delete(ARTICAL_TABLE、選択、selectionArgs)。 // 删除所有记录 場合CODE_PARAM: 長い ID = ContentUris.parseId(URI)。 // 取得ウリ后面的数字 ストリングここ= "_id =" + ID。 もし(NULL!=選択&&(selection.trim())に等しい( "" )){ ここで、 + = "と" + 選択。 } 戻りdb.delete(ARTICAL_TABLE、selectionArgs)。 デフォルト: スロー 新しい(、IllegalArgumentExceptionを"これはunknow URIは次のとおりです。" URI)。 } @Override 公共 int型の更新(URIのURI、ContentValuesのCV、ストリング選択、文字列[] selectionArgs){ // TODO自動生成方法スタブ Log.i(TAG、 "更新()" )。 SQLiteDatabase DB = dbOpenHelper.getWritableDatabase()。 スイッチ(MATCHER.match(URI)){ ケースCODE_NOPARAM: 戻り db.update(ARTICAL_TABLE、CV、選択、selectionArgs)。 // 更新所有记录 場合CODE_PARAM: 長い ID = ContentUris.parseId(URI)。 //取得ウリ后面的数字 文字列= "_id =" +ID; IF(NULL!=選択&&(selection.trim())に等しい( ""。){) + = "と" + 選択; } 戻りdb.update(ARTICAL_TABLE、CV、selectionArgs); 既定: スロー 新しい新しい IllegalArgumentExceptionが(「このURI unknowです:」+ URI); } } / ** *返され、対応するコンテンツ・タイプ *コンテンツの戻り値の型は、com.test.android.cursor.dirを開始しなければならない場合に設定 *の場合単一の要素、com.test.android.cursor.item起動する必要があります * / @Overrideを 公共のストリングのgetType(URI URI){ //TODO自動生成方法スタブ Log.i(TAG "のgetType()" )。 スイッチ(MATCHER.match(URI)){ ケースCODE_NOPARAM: リターン "com.test.android.cursor.dir / artical" 。 ケースCODE_PARAM: リターン "com.test.android.cursor.item / artical" ; デフォルト: スロー 新しい、IllegalArgumentExceptionを( "これはunknow URIです:" + URI)。 } } @Override 公共カーソルクエリ(URIのURI、文字列[]投影、ストリング選択、文字列[] selectionArgs、 // TODO自動生成方法スタブ Log.i(TAG、 "クエリ()" )。 SQLiteDatabase DB = dbOpenHelper.getReadableDatabase()。 スイッチ(MATCHER.match(URI)){ ケースCODE_NOPARAM: 戻り db.query(ARTICAL_TABLE、投影、選択、selectionArgs、NULL、NULL 、ORDERBY)。 ケースCODE_PARAM: 長い ID = ContentUris.parseId(URI)。 //取得ウリ后面的数字 文字列= "_id =" + ID。 もし(ヌル!=選択&&!(selection.trim())。等号( "")){ ここで、 + = "と" + 選択。 } 戻り db.query(ARTICAL_TABLE、投影、selectionArgs、NULL、NULL 、ORDERBY)。 デフォルト: スロー 新しい、IllegalArgumentExceptionを( "これはunknow URIです:" + URI)。 } } }
このクラスは、データベースの実際の動作を見ることができる基本的なCRUD方法を提供します。前記DBOpenHelper SQLiteOpenHelperクラスは、基本的なデータベースの作成が含まれているカスタムクラスから継承された操作のような表を作成し、比較的単純な、ここにコードを掲示していません。
具体的な手順:
1は、カスタムクラスを作成している、あなたはあなたののAndroidManifest.xmlにそれを登録する必要があります。
<! - 定義された権限の一部から、あなたが他のアプリケーションで使用するために公開する必要があり - >
<許可アンドロイド:名=「android.permission.WRITE_SCP」/>
<許可アンドロイド:名=「android.permission.READ_SCP」/>
< プロバイダ アンドロイド:名 = "com.test.contentprovider.SimpleContentProvider" アンドロイド:当局 = "com.test.providers.SimpleContentProvider" アンドロイド:エクスポートされた "真の" = アンドロイド:readPermission = "android.permission.READ_SCP" アンドロイド:writePermission = "android.permission.WRITE_SCP" > <path- 許可 アンドロイド:Pathprefixは= "/ SEARCH_QUERY" のandroid:readPermission = "android.permission.GLOBAL_SEARCH" /> </プロバイダ>
説明:
アンドロイド:=「true」のエクスポートは、他のアプリケーションでプロバイダへのアクセスを可能にします。falseに設定されている場合のみ、アプリケーションまたはサービスを起動またはバインドするために同じユーザーIDを持つアプリケーションのコンポーネントで。
アンドロイド:当局の承認情報、のContentProviderから自分自身を区別するための
アンドロイド:権限の許可アクセスプロバイダの声明
:権限の細分化は、次の二つに分けることができます
アンドロイド:読み取り許可をreadPermission、
アンドロイド:writePermissionの書き込み権限
許可の優先順位よりも詳細なアクセス許可の後に[質問]。
しかし、テスト結果があることを示した:のみ読み書きできる別のアプリケーションプロバイダにreadPermissionまたはwritePermission権限を追加し、どこその役割を絞り込みますか?インターネット関連のプレゼンテーションではなく、見つけることができなかった、誰もが知っている場合、通知するためにメッセージを残すことができ、ありがとうございました!
図2は、他のアプリケーションがプロバイダにアクセスするときに権利の宣言以来、そう、AndroidManifest.xmlにもアクセス不能のアクセスを要求する必要があります。
<アンドロイド許可使用しています:名= "android.permission.READ_SCP" /> <アンドロイド許可使用しています:名= "android.permission.WRITE_SCP" />
3、プログラムの訪問:
ウリのuri = Uri.parse( "コンテンツ://com.test.providers.SimpleContentProvider/artical" ); ContentResolverのレゾルバ = getContentResolver()。 ContentValues値 = 新しいContentValues()。 values.put( "タイトル"、 "testcase1" ); values.put( "コンテンツ"、 "ContentProviderの-置きます" ); resolver.insert(URI、値)。
これは、アクセスの単純なカスタムのContentProviderの一例以上のものです。
4.まとめ:
典型的には、のContentProvider又はデータ操作を格納するためのデータベースではなく、カプセル化されます。かどうか、カスタムクラスのネイティブ型システム、それはContentProviderの+ SQLiteOpenHelperを使用して達成されます。システムMediaProvider、SettingsProviderまたはカスタムSimpleContentProviderは、上記真である:実施例(カスタムクラスのContentProvider、SQLiteOpenHelperは、対応するデータベース操作を継承するカスタムクラスを実装継承します)。
しかし、これは可能ContentProviderのが唯一のデータベース、ファイルなどの操作を意味するものではありませんが、私がテストしていない、独立して関心を確認することができます。
第二に、拡張:
一般的に、いくつかの方法で使用されるカーソルトラバースのContentProviderは、総括:実際には、()しばらく使用しています。
1 ContentResolverのレゾルバ= getContentResolver(); 2 = resolver.queryカーソルカーソル(URI、NULL、NULL、NULL、NULL ); 3 IF(!カーソル= NULL && cursor.getCount()> 0 ){ 4 ..... // コード位置を介して 5 } 。6 。7 方法A: 8 のための(cursor.moveToFirst();! cursor.isAfterLast(); cursor.moveToNext()){ 9 ... 10 } 11 12である 2: 13 同時に(cursor.moveToNext()){ 14 ... // 特定動作 15 } 16 17。 方法3: 18である 。19 cursor.moveToFirst(); // 最初の行に、デフォルトカーソルの添え字-1 20は 、一方( !cursor.isAfterLast()){ 21は ....... 22れる ....... // 特定動作 23である cursor.moveToNext(); 24 } 25 26は、 4: 27 cursor.moveToFirst(); 28 実行{ 29 ...... 30 } ながら(cursor.moveToNext())。
コードは非常に単純なように見えますが、セルフテストの過程で、それは奇妙な質問でした。
いくつかの欠落データの散発的な場合(すなわち、現在、3つのデータを持っている2つだけを読んで、使用中にデータを読み込むためのレコードIDが正常に3を読み取ることができる場合)(この時間はなく)しながら、具体的な理由繰り返しテストは、ケースを書き留めたメッセージはこのことを知っているためにそこにあるかもしれ、ありがとうございましたので、ここでは、再現することはできません後、見つかりません。