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
}
}
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentprovider
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- ContentProvider
- contentprovider
- contentprovider
- ContentProvider
- ContentProvider
- Linux字符截取命令-cut
- keyboard
- Android Volley完全解析(一),初识Volley的基本用法
- 【light-oj】-1189 - Sum of Factorials(思维,数学)
- KafKa常用命令
- ContentProvider
- 【第三周】第三章习题3.6
- Reverse Integer
- Pyqt5系列(八)-自定义信号
- SQLServer数据库还原时遇到问题,“质集有2个介质簇,但只提供了1个。必须提供所有成员”
- c语言 变量命名法
- CTF训练营-牛刀小试-聪明的小羊
- python 网络编程学习 http/cookie
- 1013. Battle Over Cities (25)