使用ContentProvise获取APP中的数据

提供数据的项目:A

获取数据的项目:B


1.先在A项目里建一个类MyContentProviser,继承ContentProvider,并重新方法

2.需要在清单文件里面配置,authoritiies相当于地址,name是类的名字,exported为是否开放

<!--配置内容提供者-->
<provider
    android:authorities="com.zking.a24provider.PERSON"
    android:name=".MyContentProvider"
    android:exported="true">
</provider>
 
3.在B项目中,获取内容访问者ContentResolver,这样通过Uri得到A项目清单文件里的提供者的地址authoritiie,
Uri中需要添加协议content://+地址,这样简单几步就可以获取到A项目中MyContentProviser里的方法了。
ContentResolver cr= getContentResolver();
Uri uri=Uri.parse("content://com.zking.a24provider.PERSON");
//通过Uri进行查询,返回一个Cursor
cr.query(uri, String[] projection, String selection, String[] selectionArgs,String sortOrder)

//将一组数据插入到Uri 指定的地方         
cr.insert(uri, ContentValues values)

//更新Uri指定位置的数据
cr.update(uri, ContentValues values, String where, String[] selectionArgs)
//删除指定Uri并且符合一定条件的数据
cr.delete(uri, String where, String[] selectionArgs)

4.这里重要的一点是URI,Uri代表了要操作的数据,Uri主要包含了两部分信息
   ①需要操作的ContentProvider
   ②对ContentProvider中的什么数据进行操作

例如:
    查询所有    content://com.zking.a24provider.PERSON/student
    查询id=1的  content://com.zking.a24provider.PERSON/student/1
所以在提供数据的项目A中需要用uriMatcher添加规则,用于匹配Uri
   ①把需要匹配Uri路径全部给注册上

  // 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
  UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

  // 若match()方法匹配content://com.zking.a24provider.PERSON/student路径则返回匹配码为1
  uriMatcher.addURI("com.zking.a24provider.PERSON","student",1);

  // 若match()方法匹配content://com.zking.a24provider.PERSON/student/1路径则返回匹配码为2
  uriMatcher.addURI("com.zking.a24provider.PERSON","student/#",2);

  ②注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配

5.实例代码
A项目 MyContentProvider类 
package com.zking.a24provider;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.util.Log;

import util.DbUtil;

/**
 * Created by Administrator on 2017/2/7.
 */

public class MyContentProvider extends ContentProvider {

    private SQLiteDatabase sqLiteDatabase;
    private UriMatcher uriMatcher;

    @Override
    public boolean onCreate() {
        Log.i("text","onCreat");
        DbUtil dbUtil = new DbUtil(getContext(), "dataa.db", null, 2);
        sqLiteDatabase = dbUtil.getReadableDatabase();

        //实例化URI匹配器
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //添加规则
        //1.查所有
        uriMatcher.addURI("com.zking.a24provider.PERSON","student",1);
        //2.查单个  /#查询的条件,类似通配符
        uriMatcher.addURI("com.zking.a24provider.PERSON","student/#",2);

        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Log.i("text","query");
        //根据URI匹配器开始匹配
        int code=uriMatcher.match(uri);
        switch (code){
            case 1: //查询所有
                return sqLiteDatabase.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
            case 2: //查询单个
                //获取#号的值
                long id= ContentUris.parseId(uri);
                return sqLiteDatabase.rawQuery("select * from student where _id=?",new String[]{""+id});
        }
        //获取数据库中所有的数据
        return sqLiteDatabase.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.i("text","getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i("text","insert");
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.i("text","delete");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.i("text","update");
        return 0;
    }
}
B项目LAUNCHER  Main2activity
package com.zking.animation;

import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class Main2Activity extends AppCompatActivity {

    private ContentResolver cr;
    private EditText mian2_id;
    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mian2_id = (EditText) findViewById(R.id.mian2_id);

        //获取内容访问者
        cr = getContentResolver();
    }

    public void getAllData(View view){
        String id1=mian2_id.getText().toString();
        //查询单个
        if("".equals(id1)){
            uri = Uri.parse("content://com.zking.a24provider.PERSON/student/"+id1);
        }else{//查询所有
            uri = Uri.parse("content://com.zking.a24provider.PERSON/student");
        }
        Cursor cursor= cr.query(uri,null,null,null,null);
        while (cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex("_id"));
            String name=cursor.getString(cursor.getColumnIndex("name"));
            int age=cursor.getInt(cursor.getColumnIndex("age"));
            Log.i("test",id+" "+name+" "+age);
        }
    }

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值