首页
登录 | 注册

Android攻城狮的第二门课(第3季)第4章 四大组件之ContentProvider

本章讲解Android中四大组件之一的ContentProvider,以及怎样通过contentProvider来实现进程间的数据共享功能
Android的四中数据存储方法:
1、SharedPreferences
2、SQLite
3、File
4、其他网络存储等
以上不可完成的任务(程序应用间的数据传递,跨程序处理数据)
都只是在单独的一个应用程序之中达到一个数据的共享。
通过的Uri访问实现增、删、该、查。

url是指通用资源标志符

content://com.imooc.provider/music/#
content:// 前缀表明数据受控于一个内容提供者。从不修改
com.imooc.provider 唯一标识 在AndroidMainfest.xml中注册
music 具体操作哪个条目
具体操作哪个条目下的哪个记录

UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH)
UriMatcher.NO_MATCH //表示不匹配任何路径的返回码
match.addURI("com.imooc.provider","music",1);
//匹配成功返回code值

ContentProvider数据分享
自己要些一个ContentProvider

package com.imooc.li806.ontentproviderdemo1;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

/**
 * Created by li806 on 2017/8/24.
 */

public class MyContentProvider extends ContentProvider {

/比如你实现了增和删,第三方程序的能力只受限于你的ContentProvider。
    @Override
    //在ContetnProvider创建后被调用
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    //根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        return null;
    }

    @Nullable
    @Override
    //返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录
    //那么MIME类型字符串 就是以vnd.android.dir/开头
//  如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    //根据Uri插入Values对应的数据
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }

    @Override
    //根据Uri删除selection指定的条件所匹配的全部记录
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Override
    //根据uri修改selection指定的条件所匹配的全部记录
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
}

查询联系人的id和姓名

package com.imooc.li806.ontentproviderdemo1;

import android.content.ContentResolver;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.Contacts;



public class MainActivity extends AppCompatActivity {
    //作用:查询系统联系人
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //使用系统提供好的ContentResolver
        ContentResolver cr = getContentResolver();
        //uri:Contacts.CONTENT_URI
        //new String[] { Contacts._ID, Contacts.DISPLAY_NAME } 查询哪些列。
        Cursor c = cr.query(Contacts.CONTENT_URI, new String[] { Contacts._ID, Contacts.DISPLAY_NAME }, null, null, null);
        if (c != null) {
            while (c.moveToNext()) {
                int id = c.getInt(c.getColumnIndex("_id"));
                Log.i("info", "_id:" + id);
                Log.i("info", "name:" + c.getString(c.getColumnIndex("display_name")));

                //取号码   Phone.NUMBER 号码    Phone.TYPE 号码类型
                //游标
                Cursor c1 = cr.query(Phone.CONTENT_URI, new String[] {
                                Phone.NUMBER, Phone.TYPE },
                        Phone.CONTACT_ID + "=" + id, null, null);
                // 根据联系人ID查询出联系人的电话号码
                if (c1 != null) {
                    while (c1.moveToNext()) {
                        int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));
                        if (type == Phone.TYPE_HOME) {
                            Log.i("info", "家庭电话:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
                        } else if (type == Phone.TYPE_MOBILE) {
                            Log.i("info", "手机:" + c1.getString(c1.getColumnIndex(Phone.NUMBER)));
                        }
                    }
                    c1.close();
                }
                // 根据联系人的ID去查询出联系人的邮箱地址
                Cursor c2 = cr.query(Email.CONTENT_URI, new String[] {
                                Email.DATA, Email.TYPE }, Email.CONTACT_ID + "=" + id, null, null);
                if (c2 != null) {//一个人可能多个邮箱
                    while (c2.moveToNext()) {
                        int type = c2.getInt(c2.getColumnIndex(Email.DATA));
                        if (type == Email.TYPE_WORK) {
                            Log.i("info", "工作邮箱:" + c2.getString(c2.getColumnIndex(Email.DATA)));
                        }
                    }
                    c2.close();
                }
            }
            c.close();
        }
    }

}


给通讯录中添加联系人

系统提供的ContentProvider
(1)查询联系人
(2)增加联系人
(3)短信的读取
(4)通话记录
(5)多媒体 (图片,视频,音频)

package com.imooc.contentproviderdemo2;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContacts;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ContentResolver cr =  getContentResolver();
        //向联系人中 插入一行数据
        ContentValues values = new ContentValues();
       Uri uri =  cr.insert(RawContacts.CONTENT_URI, values);
       Long raw_contact_id = ContentUris.parseId(uri); //解析uri

       values.clear();//清空values
       //插入人名
       values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);
       values.put(StructuredName.DISPLAY_NAME, "张三三");
       values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//插入的数据类型
       uri = cr.insert(Data.CONTENT_URI, values);

       //插入电话信息
       values.clear();
       values.put(Phone.RAW_CONTACT_ID,raw_contact_id);
       values.put(Phone.NUMBER,"13333333333");
       values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);//数据类型
       uri = cr.insert(Data.CONTENT_URI, values);
    }



}

记得给AndroidMainfest.xml加权限

 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>

Android攻城狮的第二门课(第3季)第4章 四大组件之ContentProvider



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号