ContentProvider

一, 什么是Content Provider?
>内容提供者   Android四大主件之一   :短信记录  通讯录  联系人   自定义


>Content Provider  所有程序间数据的存储和检索的桥梁 把各个程序里的数据共享 
各个程序间  数据共享的唯一途径 (Android  没有提供一块独立的空间  将各个程序的数据共享  
只能通过  内容提供者  共享数据)

二, 作用
>将自己程序的私有数据  提供里一套对外的访问接口(增,删,改,查)
是基于Uri向外提供数据访问接口




    使用:
Content Provider 提供私有数据
Uri:统一资源标识符  (路径)
ContentResolver:内容解析器 

服务器端




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;


/**
 * 将自己私有数据提供出去
 * 1,创建一个类  继承 ContentProvider
 * 2,实现里面的方法
 * 3,创建Uri
 * 4,在各个方法中 进行匹配Uri  如果匹配上执行相应动作
 *
 *
 * android:authorities="com.qf.provider.mycontentprovider"
 */
public class MyContentProvider extends ContentProvider{

private MyDbOpenHelper helper;

/**
* 创建Uri对象  和匹配Uri对象的对象
*/
private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

private static int  QUERY = 1;//表示查询的匹配值
private static int  INSERT = QUERY+1;//表示插入的匹配值
private static int  UPDATE = INSERT+1;//表示修改的匹配值
private static int  DELETE =UPDATE+ 1;//表示删除的匹配值
//首先执行
static{
/**
* 创建Uri对象   
* 参数1:权限 (清单文件进行注册时获取的)
* 参数2:当前 访问Uri的地址
* 参数3:当前程序和客户端程序的Uri的匹配值
*/
uriMatcher.addURI("com.qf.provider.mycontentprovider", "query", QUERY);
//content://com.qf.provider.mycontentprovider/query
uriMatcher.addURI("com.qf.provider.mycontentprovider", "insert", INSERT);
uriMatcher.addURI("com.qf.provider.mycontentprovider", "update", UPDATE);
uriMatcher.addURI("com.qf.provider.mycontentprovider", "delete", DELETE);
}
/**
* 提供给当前程序使用 
* 当前MyContentProvider创建时调用
*/
@Override
public boolean onCreate() {
    // TODO Auto-generated method stub
    //获取数据库帮助类
    helper = new MyDbOpenHelper(getContext());
    return false;
}


/**
* 提供给客户端程序使用
* 表示访问当前应用程序  用于查询   返回   Cursor
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {
    // TODO Auto-generated method stub
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor  cursor = null;
    //查询的匹配值  匹配上
    if(uriMatcher.match(uri)==QUERY){
    cursor = db.query("person", projection, selection, selectionArgs, null, null,       
    sortOrder);
}


return cursor;
}

/**
* 返回Uri的类型   一般不使用
*/
@Override
public String getType(Uri uri) {
    // TODO Auto-generated method stub
    return null;
}

/**
*  提供给客户端程序使用
*  向本应用程序插入数据  返回值是当前插入数据的Uri(每一row的Uri)
*   
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
    // TODO Auto-generated method stub
    SQLiteDatabase db = helper.getReadableDatabase();
    if(uriMatcher.match(uri) == INSERT){
        db.insert("person", null, values);
    }
    return null;
}


/**
* 提供给客户端程序使用
* 从本应用程序里删除数据   返回值 int  表示删除符合条件的有几row
* 
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
    SQLiteDatabase db = helper.getReadableDatabase();
    int num =0;
    if(uriMatcher.match(uri) == DELETE){
        num = db.delete("person", selection, selectionArgs);
    }
    return num;
}




/**
* 提供给客户端程序使用
* 从本应用程序里修改数据  返回值  int  表示  更改数据 有几row
* 
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
    // TODO Auto-generated method stub
    SQLiteDatabase db = helper.getReadableDatabase();
    int num =0;
    if(uriMatcher.match(uri)==UPDATE){
        num = db.update("person", values, selection, selectionArgs);
    }
    return num;
}







}

客户端




import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;


public class MainActivity extends Activity {

private ListView lv;

private ContentResolver resolver;

//查询  添加   修改  删除  Uri
private String queryUri = "content://com.qf.provider.mycontentprovider/query";
private String insertUri = "content://com.qf.provider.mycontentprovider/insert";
private String updateUri = "content://com.qf.provider.mycontentprovider/update";
private String deleteUri = "content://com.qf.provider.mycontentprovider/delete";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv = (ListView) findViewById(R.id.lv);
    resolver = getContentResolver();
    queryData();
}


public void MyClick(View v){
    switch (v.getId()) {
        case R.id.btn_add:
            insertData();
            break;
        case R.id.btn_update:
            updateData();
            break;
        case R.id.btn_delete:
            deleteData();
            break;


        default:
            break;
}

        queryData();
}

//删除数据
public void deleteData(){
    int num =resolver.delete(Uri.parse(deleteUri), "_id = ?", new String[]{"2"});
    if(num>0){
        Toast.makeText(MainActivity.this, "删除数据成功", 0).show();
    }else{
        Toast.makeText(MainActivity.this, "删除数据失败", 0).show();
    }
}

//修改数据
public void updateData(){
    ContentValues values = new ContentValues();
    values.put("name", "shuaige");
    values.put("age", 16);
    int num = resolver.update(Uri.parse(updateUri), values, "name = ?", new String[]        {"zhangsan"});
    if(num>0){
        Toast.makeText(MainActivity.this, "修改数据成功", 0).show();
    }else{
        Toast.makeText(MainActivity.this, "修改数据失败", 0).show();
    }
}

//添加数据
public void insertData(){

ContentValues values = new ContentValues();
values.put("name", "zhangsan");
values.put("age", 18);
resolver.insert(Uri.parse(insertUri), values);

values.clear();
values.put("name", "lisi");
values.put("age", 19);
resolver.insert(Uri.parse(insertUri), values);

values.clear();
values.put("name", "wangwu");
values.put("age", 20);
resolver.insert(Uri.parse(insertUri), values);

}

//查询数据
public void queryData(){
    Cursor cursor = resolver.query(Uri.parse(queryUri), null, null, null, null);
    SimpleCursorAdapter adapter = new SimpleCursorAdapter
    (MainActivity.this, R.layout.item, cursor, 
    new String[]{"name","age"},
    new int[]{R.id.tv_name,R.id.tv_age},         SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

    lv.setAdapter(adapter);
}


}

数据库




import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class MyDbOpenHelper extends SQLiteOpenHelper {

private static final String NAME ="info.db";
private static final int VERSION = 1;


public MyDbOpenHelper(Context context, String name, CursorFactory factory,
int version) {
    super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    public MyDbOpenHelper(Context context) {
        super(context, NAME, null, VERSION);
        // TODO Auto-generated constructor stub
    }


    @Override
    public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub

        String sql = "create table person(_id integer primary key autoincrement,name                 
        varchar(16),age integer)";
        db.execSQL(sql);

}


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值