Android ---四大组件(ContentProvider篇)

一,ContentProvider详情

ContentProvider是一个APP的对外接口,其他第三方APP或者本身APP通过Uri格式进行访问,得到自己想要的数据,实现数据间的共享功能。

Uri的格式:<srandard_prefix>://<authority>/<data_path>/<id>

srandard_prefix:这里用content://代表

authority:ContentProvider的名称,例如:com.xxx.mycontentprovider

data_path:请求的数据类型

id:指定请求的特定数据

例子如:

    content://com.xxx.mycontentprovider/userdemo
     content://media/internal/images  这个URI将返回设备上存储的所有图片
     content://contacts/people/  这个URI将返回设备上的所有联系人信息
     content://contacts/people/45 这个URI返回单个结果(联系人信息中ID为45的联系人记录)

二,ContentProvider使用方法

这里我使用的是数据库共享

1,创建并使用A应用,创建数据库,并添加正删改查功能

2,创建并使用B应用,访问A应用的数据库数据,也添加增删改查功能

A应用

数据库的创建:User.db

/**
 * 创建新类继承ContentProvider
 */
public class UserProvider extends ContentProvider {

    private MyDatabaseHelper dbHelper; //用于创建数据库
    public static final String AUTHORITY = "com.xxx.mycontentprovider"; //创建authority
    //创建UriMatcher对象
    private static UriMatcher uriMatcher;

  
    public static final int USER_DIR = 0;
    public static final int USER_ITEM = 1;

    //创建静态代码块
    static {
        //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //添加两个URI筛选
        uriMatcher.addURI(AUTHORITY , "user" , USER_DIR);
        //使用通配符#,匹配任意数字
        uriMatcher.addURI(AUTHORITY , "user/#" , USER_ITEM);
    }

    public UserProvider() {
        Log.e("TAG", "DatabaseProvider: ");
    }

    @Override
    public boolean onCreate() {
        //创建数据库
        dbHelper = new MyDatabaseHelper(getContext() , "User.db" , null , 1);
        Log.e("TAG", "onCreate()-->创建成功 ");
        return false;
    }

    //查询数据
    @Override
    public Cursor query( Uri uri, String[] projection,  String selection,  String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = null;
        //通过两种方式的查询
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                cursor = db.query("user" , projection , selection , selectionArgs , null , null , sortOrder);
                break;
            case USER_ITEM:
                String queryId = uri.getPathSegments().get(1);
                cursor = db.query("user" , projection , "id=?" , new String[]{queryId} , null , null , sortOrder);
                break;
        }
        return cursor;
    }

    @Override
    public String getType( Uri uri) {
        Log.e("TAG", "getType");
        return null;
    }

    //插入数据
    @Override
    public Uri insert( Uri uri,  ContentValues values) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        //因为插入数据时,两条命令语句一样的
        switch (uriMatcher.match(uri)){
            case USER_DIR:
            case USER_ITEM:
                long userid = db.insert("user" , null , values);
                break;
        }
        return null;
    }

    //删除数据
    @Override
    public int delete( Uri uri,  String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int deleteInt = 0;
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                //参数1:表名   参数2:约束删除列的名字   参数3:具体行的值
                deleteInt = db.delete("user" , selection , selectionArgs);
                break;
            case USER_ITEM:
                //根据id删除
                String deleteId = uri.getPathSegments().get(1);
                deleteInt = db.delete("user" , "id=?" , new String[]{deleteId});
                break;
        }
        return deleteInt;
    }

    //更新表中某元素
    @Override
    public int update(Uri uri, ContentValues values,  String selection,  String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int updateint = 0;
        switch (uriMatcher.match(uri)){
            case USER_DIR:
                updateint = db.update("user" , values , selection , selectionArgs);
                break;
            case USER_ITEM:
                String updateId = uri.getPathSegments().get(1);
                updateint = db.update("user" , values , "id=?" , new String[]{updateId});
                break;
        }
        return updateint;
    }
}

主函数Activity中进行增删改查

public class MainActivity extends AppCompatActivity {
    EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.et);
    }

    //增
    public void onadd(View view ){
        String str = editText.getText().toString().trim();
        String[] strs = str.split(",");
        int phone = Integer.parseInt(strs[0]);
        int age = Integer.parseInt(strs[1]);
        String name = strs[2];

        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        ContentValues values = new ContentValues();
        values.put("phone" , phone);
        values.put("age" , age);
        values.put("name" , name);
        //获得ContentResolver对象,调用方法
        getContentResolver().insert(uri , values);
    }

    //删
    public void ondetele(View view ){
        String name = editText.getText().toString().trim();
        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        getContentResolver().delete(uri , "name=?" , new String[]{name});
    }

    //改
    public void ongai(View view){
        String updatename = editText.getText().toString().trim(); //要改成的name
        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        ContentValues values = new ContentValues();
        values.put("name" , updatename);
        //修改name=kk的元素
        getContentResolver().update(uri , values , "name=?" ,new String[]{"kk"} );
    }

    //查
    public void onquery(View view){
       Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
        Cursor cursor =  getContentResolver().query(uri , null , null , null ,null);
        cursor.moveToFirst();
        //打印所有从数据库里找出来的
        do{
            String name = cursor.getString(cursor.getColumnIndex("name"));
            Log.e("TAG", name );

        }while (cursor.moveToNext());
        cursor.close();

    }

}

增加onAdd()

如图:

Android ---四大组件(ContentProvider篇)

使用查的onquery()进行打印,查看是否成功

Android ---四大组件(ContentProvider篇)

Android ---四大组件(ContentProvider篇)

删ondelete

Android ---四大组件(ContentProvider篇)                           Android ---四大组件(ContentProvider篇)

改ongai(),uu-->bb

Android ---四大组件(ContentProvider篇)

注意:在AndroidManifest.xml中还要添加

<provider
            android:authorities="com.xxx.mycontentprovider"
            android:name=".UserProvider"/>

如果第三方APP应用要访问此APP的应用的数据库时,差不多也是这样

B应用中主Activity

public class MainActivity extends AppCompatActivity {
    EditText editText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.et);
    }


    //增
    public void onadd(View view ){
        String str = editText.getText().toString().trim();
        String[] strs = str.split(",");
        int phone = Integer.parseInt(strs[0]);
        int age = Integer.parseInt(strs[1]);
        String name = strs[2];

        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        ContentValues values = new ContentValues();
        values.put("phone" , phone);
        values.put("age" , age);
        values.put("name" , name);
        //获得ContentResolver对象,调用方法
        getContentResolver().insert(uri , values);
    }

    //删
    public void ondetele(View view ){
        String name = editText.getText().toString().trim();
        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        getContentResolver().delete(uri , "name=?" , new String[]{name});
    }

    //改
    public void ongai(View view){
        String updatename = editText.getText().toString().trim(); //要改成的name
        Uri uri  = Uri.parse("content://com.xxx.mycontentprovider/user");
        ContentValues values = new ContentValues();
        values.put("name" , updatename);
        //修改name=kk的元素
        getContentResolver().update(uri , values , "name=?" ,new String[]{"kk"} );
    }

    //查
    public void onquery(View view){
        Uri uri = Uri.parse("content://com.xxx.mycontentprovider/user");
        Cursor cursor =  getContentResolver().query(uri , null , null , null ,null);
        cursor.moveToFirst();
        //打印所有从数据库里找出来的
        do{
            String name = cursor.getString(cursor.getColumnIndex("name"));
            Log.e("TAG", name );

        }while (cursor.moveToNext());
        cursor.close();

    }
}

注意:因为第三方调取,原来的A应用的AndroidManifest.xml要修改

<provider
            android:authorities="com.xxx.mycontentprovider"
            android:name=".UserProvider"
            android:enabled="true"
            android:exported="true"
        />