ContentProvider

来源:互联网 发布:30岁程序员失业怎么办 编辑:程序博客网 时间:2024/05/21 15:05

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


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

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




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

服务器端

package com.qf.day17_contentprovider_server.provider;



import com.qf.day17_contentprovider_server.db.MyDbOpenHelper;


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;
}


}


客户端

package com.qf.day17_contentprovider_client_demo1;


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);
}


}

数据库

package com.qf.day17_contentprovider_server.db;


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

}


}


0 0