ContentProvider&ContentResolverの学習と使用について

10274 ワード

一、ContentProviderの定義
1.ContentProviderはAndroidの4大コンポーネントである.ContentProviderは、データがどのように格納されているかにかかわらず、統一的なインタフェースを提供するデータパッケージ(パブリッシャ)です.ContentProviderは主に異なるAPP間、異なるプロセス間のデータ共有に使用されます.
二、ContentProviderの使用手順
  • SQLiteテクノロジーを使用して、データベースとデータテーブル
  • を作成します.
  • 新規クラス継承ContentProvider
  • UriMatcher定義Uriルールを作成する
  • 6個の抽象メソッド(onCreate,insert,delete,getType,update,query)
  • を書き換える
  • AndroidManifestにProvider
  • を登録
  • ContentProvider,ContentProviderが共有するデータを添削して
  • を調べる.
    三、ContentResolverの定義
    1.contentResolverはデータ呼び出し者であり、ContentProviderがデータを発行した後、ContentResolverオブジェクトを介してUriと結合する呼び出しを行う.ContentResolverでContentProviderの追加、削除、変更、検索操作を呼び出すことができます.
    注意点:****ContentProviderとContentResolverは間違いなく重要であり、それらの間でデータの伝達を行うことも重要であり、Uriである.
    四、Uriの定義
    1.汎用リソースの識別子、略称Uri 2.Uriはデータを操作するアドレスを表し、ContentProviderごとにデータを発行する際に一意のアドレス3がある.Uriの標準表記:content://com.android.contacts/contacts
    注意:*ContentProviderを呼び出す前に、Uri***を確認する必要があります.
    五、UriMatcherクラスの定義
    1.UriMatcherは、UriにマッチするためのUriルールツールクラス2である.呼び出し元から渡されたUriを解析し,呼び出し元がどの操作を実行する必要があるかを決定する必要がある.
    六、ContentProvider&ContentResolverを組み合わせて使用した例(増を例とする)
    ContentProviderはAPP間で呼び出されるので、Activityを2つ作成します.ここではActivity AとActivity Bと略称します.まずActivity Aにクラス継承ContentProviderを新設し,その中で彼のいくつかの構造方法を実現する
    public class MyContentProivder extends ContentProvider {
        private String  TAG="MyContentProivder";
    
    
        @Override
        public boolean onCreate() {
            Log.e(TAG, "onCreate************************ " );
            return false;
        }
    
        @Nullable
        @Override
        public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
            Log.e(TAG, "query************************ " );
            return null;
        }
    
        @Nullable
        @Override
        public String getType(@NonNull Uri uri) {
            Log.e(TAG, "getType************************ " );
            return null;
        }
    
        @Nullable
        @Override
        public Uri insert(@NonNull Uri uri, @Nullable ContentValues contentValues) {
            Log.e(TAG, "insert************************ " );
    
            return null;
    
        }
    
        @Override
        public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
            Log.e(TAG, "delete************************ " );
    
            return 1;
        }
    
        @Override
        public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
            Log.e(TAG, "update************************ " );
            return 0;
        }
    }
    

    2.そしてこのActivityのAndroidマニフェストにProviderを登録
     <provider
                android:enabled="true"
                android:exported="true"
                android:authorities="com.example.studentdemo.db"
                android:name=".entity.MyContentProivder"/>

    3.Activity Bのlayoutレイアウトに必要なコントロールを定義します
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.contentresover.MainActivity">
    
        <EditText
            android:id="@+id/input_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <Button
            android:id="@+id/text_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="  "/>
    
    LinearLayout>
    

    4.次にマスタークラスに戻ってこれらのコントロールを定義し、クリックイベントを設定し、switch判断文を書く
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
        private Button textBtn;
        private EditText inputET;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            textBtn=findViewById(R.id.text_btn);
            inputET=findViewById(R.id.input_et);
    
            textBtn.setOnClickListener(this);
    
    
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()){
                case R.id.text_btn:

    5.そしてActivityAのinsertメソッドに次のように書きます.
      DBHelper dbHelper=new DBHelper(getContext(),"student_db",null,1);
            SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
            ContentValues values=new ContentValues();
            values.put("name","zhangsan");
            sqLiteDatabase.insert("student",null,values);
            return null;
    

    6.最後にActivity Bのクリック方法に戻って、追加の具体的なコードを書く
     String name=inputET.getText().toString();
                    Uri uri=Uri.parse("content://com.example.studentdemo.db/student");
                    ContentResolver resolver=getContentResolver();
                    ContentValues values=new ContentValues();
                    values.put("name",name);
                    resolver.insert(uri,values);
    
                    break;

    ここでは、Uriが書いたURLが登録時のURLと同じように芯があることに注意しましょう!