day 10コンテンツプロバイダノート


コンテンツプロバイダ

  • アプリケーションのデータベースは、他のアプリケーションがアクセスできない
  • である.
  • コンテンツプロバイダの役割は、他のアプリケーションをデータベース
  • にアクセスさせることです.
  • カスタムコンテンツプロバイダは、ContentProviderクラスを継承し、追加削除変更方法を書き換え、方法に追加削除変更データベースのコードを書き、例として、追加方法
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        db.insert("person", null, values);
        return uri;
    }
    
  • を挙げる.
  • インベントリファイルでコンテンツプロバイダのラベルを定義します.authoritiesプロパティが必要です.これはコンテンツプロバイダのホスト名で、機能類似アドレス
    <provider android:name="com.itheima.contentprovider.PersonProvider"
        android:authorities="com.itheima.person"
        android:exported="true"
     ></provider>
    
  • です.
  • 他のアプリケーションを作成し、カスタムコンテンツプロバイダにアクセスし、データベースへの挿入操作
    public void click(View v){
        // 
        ContentResolver cr = getContentResolver();
        ContentValues cv = new ContentValues();
        cv.put("name", " ");
        cv.put("phone", 138856);
        cv.put("money", 3000);
        //url: 
        cr.insert(Uri.parse("content://com.itheima.person"), cv);
    }
    
  • を実現する.

    UriMatcher

  • は、1つのuriが指定された複数のuriのうちのどのuriと一致するかを判断するために使用される
  • である.
  • マッチングルール
    // uri  person/company   PERSON_CODE/COMPANY_CODE/QUERY_ONE_PERSON_CODE integer   
    um.addURI("com.itheima.person", "person", PERSON_CODE);
    um.addURI("com.itheima.person", "company", COMPANY_CODE);
    //# 
    um.addURI("com.itheima.person", "person/#", QUERY_ONE_PERSON_CODE);
    
  • を追加
  • Uri整合器により異なるテーブル
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        if(um.match(uri) == PERSON_CODE){
            db.insert("person", null, values);
        }
        else if(um.match(uri) == COMPANY_CODE){
            db.insert("company", null, values);
        }
        else{
            throw new IllegalArgumentException();
        }
        return uri;
    }
    
  • を操作することができる.
  • 経路に数字がある場合、数字を抽出するapi
    int id = (int) ContentUris.parseId(uri);
    
  • メールデータベース

  • smsテーブル
  • に注目するだけです
  • は4つのフィールドに注目するだけです
  • body:メール内容
  • address:メールの送信者または受信者番号(チャットしている兄弟の番号)
  • date:メール時間
  • type:1は受信、2は送信
  • システムメールを読み出し、まずソースコードを問い合せてメールデータベースのコンテンツプロバイダのホスト名とパスを取得し、
    ContentResolver cr = getContentResolver();
    Cursor c = cr.query(Uri.parse("content://sms"), new String[]{"body", "date", "address", "type"}, null, null, null);
    while(c.moveToNext()){
        String body = c.getString(0);
        String date = c.getString(1);
        String address = c.getString(2);
        String type = c.getString(3);
        System.out.println(body+";" + date + ";" + address + ";" + type);
    }
    
  • 挿入システムメール
    ContentResolver cr = getContentResolver();
    ContentValues cv = new ContentValues();
    cv.put("body", " XXXX 1,000,000 ");
    cv.put("address", 95555);
    cv.put("type", 1);
    cv.put("date", System.currentTimeMillis());
    cr.insert(Uri.parse("content://sms"), cv);
    
  • クエリーシステムメールを挿入するには登録権限が必要
  • 連絡先データベース

  • raw_contactsテーブル:
  • contact_id:連絡先id
  • data表:連絡先の具体的な情報、1つの情報が1行を占める
  • data 1:情報の具体的な内容
  • raw_contact_id:連絡先id、どの連絡先
  • に属するかを記述する
  • mimetype_id:記述情報がどのタイプに属するか
  • mimetypesテーブル:mimetype経由_idこのテーブルに特定のタイプ
  • を表示

    連絡先の読み取り

  • 先クエリraw_contactsテーブルは連絡先id
    Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"), new String[]{"contact_id"}, null, null, null);
    
  • を取得する.
  • その後、連絡先idを持ってdataテーブルに行って、その連絡先に属する情報
    Cursor c = cr.query(Uri.parse("content://com.android.contacts/data"), new String[]{"data1", "mimetype"}, "raw_contact_id = ?", new String[]{contactId}, null);
    
  • を照会する.
  • 得られたdata 1フィールドの値は、連絡先の情報であり、mimetypeによりどのようなタイプの情報であるかを判断する
    while(c.moveToNext()){
        String data1 = c.getString(0);
        String mimetype = c.getString(1);
        if("vnd.android.cursor.item/email_v2".equals(mimetype)){
            contact.setEmail(data1);
        }
        else if("vnd.android.cursor.item/name".equals(mimetype)){
            contact.setName(data1);
        }
        else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
            contact.setPhone(data1);
        }
    }
    
  • である.

    連絡先の挿入

  • 先クエリraw_contactsテーブル、新しい連絡先のidが何であるべきかを決定する
  • 確定した連絡先idをraw_に挿入するcontacts表
    cv.put("contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/raw_contacts"), cv);
    
  • dataテーブルにデータを挿入
  • 3フィールド:data 1、mimetype、raw_contact_id
    cv = new ContentValues();
    cv.put("data1", " ");
    cv.put("mimetype", "vnd.android.cursor.item/name");
    cv.put("raw_contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/data"), cv);
    
    cv = new ContentValues();
    cv.put("data1", "1596874");
    cv.put("mimetype", "vnd.android.cursor.item/phone_v2");
    cv.put("raw_contact_id", _id);
    cr.insert(Uri.parse("content://com.android.contacts/data"), cv);
    


  • コンテンツオブザーバ

  • データベースデータが変更されると、コンテンツプロバイダが通知を発行し、コンテンツプロバイダのuriにコンテンツオブザーバーを登録すると、データ変更の通知//trueを受け取ることができ、uriで始まる変更がfalseに一致することを示すと、正確に一致する変更が必要であることを示すcr.registerContentObserver(Uri.parse(「content://sms”), true, new MyObserver(new Handler()));
    class MyObserver extends ContentObserver{
    
        public MyObserver(Handler handler) {
            super(handler);
            // TODO Auto-generated constructor stub
        }
    
        // , 
        @Override
        public void onChange(boolean selfChange) {
    
        }
    
    }
    
  • コンテンツプロバイダに通知するコード
    ContentResolver cr = getContext().getContentResolver();
    // , uri 
    cr.notifyChange(uri, null);
    
  • .