Android四组件-ContentProvider

一、ContentProvider–内容提供者
1、建立一个类继承抽象类ContentProvider,在类中对其可以完成数据的增、删、改、查。

import android.content.ContentProvider;
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;

/**
 * Created by Administrator on 2016/10/9.
 */

public class MyContentProvider extends ContentProvider {

    private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

    private static final int QUERYSUCCESS = 1;
    private static final int INSERTSUCCESS = 2;
    private static final int UPDATESUCCESS = 3;
    private static final int DELETESUCCESS = 4;

    MySqliteHelper helper;
    static{
        //  com.yingu.provider/query
        //  com.yingu.provider  要和配置清单中的保持一致
        sURIMatcher.addURI("com.yingu.provider","query",QUERYSUCCESS);
        sURIMatcher.addURI("com.yingu.provider","insert",INSERTSUCCESS);
        sURIMatcher.addURI("com.yingu.provider","update",UPDATESUCCESS);
        sURIMatcher.addURI("com.yingu.provider","delete",DELETESUCCESS);
    }
    //当ContentProvider被创建时候被调用
    @Override
    public boolean onCreate() {
        //初始化我们编写的OpenHelper
        helper =new MySqliteHelper(getContext());

        return false;
    }
    //根据Uri查询selection指定条件所匹配的全部记录
    //并且可以指定查询那系列以什么方式排列
    //此方法已开始对外暴露
    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

        int code =sURIMatcher.match(uri);
        if(code == QUERYSUCCESS){
            //说明路径匹配成功
            SQLiteDatabase db= helper.getWritableDatabase();
            //获取Cursor
            Cursor cursor = db.query("info",projection,selection,selectionArgs,null,null,sortOrder);
            return  cursor;
        }else{
            throw new IllegalArgumentException("URI错误,请检查");
        }

    }
    //返回当前Uri的MIME类型,如果URI对应的数据可能包含多条记录
    //那么MIME类型字符串就是以vnd.android.dir/开头
    //如果该URI对应的数据只有一条记录,那么MIME类型字符串就是以vnd.android.cursor.item/开头
    @Nullable
    @Override
    public String getType(Uri uri) {
        return null;
    }
    //根据Uri插入Value对应的数据
    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code =sURIMatcher.match(uri);
        if(code == INSERTSUCCESS){
            //说明路径匹配成功
            SQLiteDatabase db= helper.getWritableDatabase();
            long insert = db.insert("info",null,values);
            Uri uri2= Uri.parse("com.yingu.success"+insert);

            // 该部分属于内容观察者的代码
            if( insert >0){
                getContext().getContentResolver().notifyChange(uri,null);
            }


            db.close();
            return uri2;
        }else{
            throw new IllegalArgumentException("URI错误,请检查");
        }

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

        int code =sURIMatcher.match(uri);
        if(code == DELETESUCCESS){
            //说明路径匹配成功
            SQLiteDatabase db= helper.getWritableDatabase();
            int delete=  db.delete("info",selection,selectionArgs);
            return  delete;
        }else{
            throw new IllegalArgumentException("URI错误,请检查");
        }

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

        int code =sURIMatcher.match(uri);
        if(code == UPDATESUCCESS){
            //说明路径匹配成功
            SQLiteDatabase db= helper.getWritableDatabase();
            int update=  db.update("info",values,selection,selectionArgs);
            return  update;
        }else{
            throw new IllegalArgumentException("URI错误,请检查");
        }

    }
}

2、需要在AndroidMainfest.xml文件中对ContentProvider完成注册

<provider
            android:authorities="com.example.androidtest14"
            android:name=".MyContentProvider"/>

PS:注册的authorities属性值是全局唯一的
3、什么是Uri
是指通用资源标志符
content://com.example.androidtest14/data/#
Uri可以分为四个部分
A(content://):前缀表明数据受控于一个内容提供者。它从不修改,也就是schema。
B(com.example.androidtest14):是指在AndroidMainfest.xml中注册的provider中的android:authorities属性所对应的(一般使用包名)。
C(/data):表示具体操作与那个条目。
D(/#):表示具体操作那个条目下的那条记录
4、UriMatcher类
UriMatcher.NO_MATCH表示不匹配任何路径的返回码

  private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);

往UriMatcher类里添加一个拼凑的Uri
UriMatcher是一个Uri的容器,容器里包含着我们即将可能操作的Uri

sURIMatcher.addURI("com.example.androidtest14", "data", 1);

二、在外部操作获取ContentProvider的数据操作
1、ContentResolver:
-使用ContentResolver操作ContentProvider中的数据,可以进行添加,删,改,查操作。
-使用Activity提供的getContentResolver()方法获取ContentResolver对象。
-ContentResolver类提供了与ContentProvider相同签名的四个方法。

import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

    //insert
    public void click1(View v){

        Uri uri = Uri.parse("content://com.yingu.provider/insert");

        ContentValues values =new ContentValues();
        values.put("name","wangwu");
        values.put("money","5000");
        Uri uri2 = getContentResolver().insert(uri,values);
        Toast.makeText(getApplicationContext(),"uri="+uri2,Toast.LENGTH_LONG).show();


    }

    //删除
    public void click2(View v){

        Uri uri = Uri.parse("content://com.yingu.provider/delete");
        int delete = getContentResolver().delete(uri,"name = ?",new String[]{"wangwu"});
        Toast.makeText(getApplicationContext(),"删除了"+delete+"条数据",Toast.LENGTH_LONG).show();


    }
    //update
    public void click3(View v){

        Uri uri = Uri.parse("content://com.yingu.provider/update");
        ContentValues values =new ContentValues();
        values.put("money","10000");
        int update = getContentResolver().update(uri,values,"name = ?",new String[]{"wangwu"});
        Toast.makeText(getApplicationContext(),"更新了"+update+"条数据",Toast.LENGTH_LONG).show();

    }
    //query
    public void click4(View v){

        //方案一
        /*SQLiteDatabase db= SQLiteDatabase.openDatabase("/data/data/com.z.androidday14/databases/Account.db",null,SQLiteDatabase.OPEN_READWRITE);
        Cursor cursor =db.query("info",null,null,null,null,null,null);
        String content="";
        if(cursor!=null && cursor.getCount()>0){
            while(cursor.moveToNext()){
                String name= cursor.getString(1);
                String money= cursor.getString(2);
                content+="name="+name+",money="+money;
            }
            cursor.close();

            ((TextView)findViewById(R.id.showText)).setText(content);
        }*/

        Uri uri = Uri.parse("content://com.yingu.provider/query");
        Cursor cursor =getContentResolver().query(uri,new String[]{"name","money"},null,null,null);
        String content="";
        if(cursor!=null && cursor.getCount()>0){
            while(cursor.moveToNext()){
                String name= cursor.getString(0);
                String money= cursor.getString(1);
                content+="name="+name+",money="+money;
            }
            cursor.close();

            ((TextView)findViewById(R.id.showText)).setText(content);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值