ContentProvider实现程序之间共享数据(如短信、联系人)

ContentProvider

Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。所以我们可以在其他应用程通过那些ContentProvider获取这些数据。

写法步骤:

首先在需要提供数据的应用中自定义一个ContentProvider类,继承自ContentProvider。

重写onCreate(),query(),delete(),update(),insert(),getType()方法。

然后在应用的清单文件中添加配置:

<provider
    android:authorities="dozz.provider"
    android:name=".provider.MyContentProvider"
    android:exported="true"
    ></provider>

 

Authorities 名称随便写,但是自己要记住。

Name:和Activity一样,是自定义ContentProvider的路径和名字。

Exported 是否暴露数据,写true。

在自定义ContentProvider中首先初始化几个参数和写静态代码块:

public static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
MySQLiteHelper mySQLiteHelper;
SQLiteDatabase database;
/**参数:
 * String authority  xml中定义的属性
 * String path   方法的标记
 * int code 匹配后返回的值  除了-1都可以
 *
 * uri匹配器   dozz.provider / query
 * */
static{
    uriMatcher.addURI("dozz.provider","query",0);
}


@Override
public boolean onCreate() {
    mySQLiteHelper = new MySQLiteHelper(getContext());
    //拿到数据库
    database = mySQLiteHelper.getWritableDatabase();
    return false;
}

/**uri:方法的匹配--
 * projection:列名
 * selection查询条件
 * selectionArgs查询条件的值
 * sortOrder排序*/
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    //成功
    if (uriMatcher.match(uri) == 0){
        Cursor cursor = database.query("demo_one",projection,selection,selectionArgs,null,null,sortOrder);
        return cursor;
    }else {//失败
        return null;
    }


}

@Nullable
@Override
public String getType(Uri uri) {
    return null;
}

@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
    if (uriMatcher.match(uri) == 1){
        long code = database.insert("demo_one",null,values);
        Log.d("MyContentProvider","code:"+code);
        Uri uri1 = Uri.parse("dozz.provider/insert");
    }else{

    }
    return null;
}

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

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    return 0;
}


在另一个应用中要初始化一个ContentResolver contentResovler= getContentResolver();

增删改查的动作中,定义uri,注意:要和ContentProvider类的动作一致,比如删除:

public void delete(View view){

    uri = Uri.parse("content://dozz.provider/delete");

    contentResolver.delete(uri,"username=?",new String[]{"2"});

    Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();

}

随后调用contentProvider的增删改查方法传入参数执行。

写法和SqliteDatabase 的封装的增删改查方法差不多,注意第一个参数永远是uri。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值