-
1. 理解
1). 为会么要有ContentProvider?
ContentProvider是什么?
2. 相关API:
ContentProvider: 内容提供者类
ContentResolver: 内容解析器类 :
Uri: 包含一个具有一定格式的字符串所对应资源的类
UriMatcher: 用来识别uri的一个uri容器
ContentUris: 操作uri的工具类
自定义ContentProvider
使用ContentResolver访问ContentProvider
、
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="insert"
android:text="INSERT" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="delete"
android:text="DELETE" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="update"
android:text="UPDATE" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="query"
android:text="QUERY" />
</LinearLayout>
package com.atguigu.l09_resolver;
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.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/*
* 通过ContentResolver调用ContentProvider插入一条记录
*/
public void insert(View v) {
//1. 得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2. 调用其insert
Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
//uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/3");
ContentValues values = new ContentValues();
values.put("name", "JACK");
uri = resolver.insert(uri, values);
Toast.makeText(this, uri.toString(), 1).show();
}
/*
* 通过ContentResolver调用ContentProvider更新一条记录
*/
public void update(View v) {
//1. 得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2. 执行update
Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
ContentValues values = new ContentValues();
values.put("name", "JACK2");
int updateCount = resolver.update(uri, values, null, null);
Toast.makeText(this, "updateCount="+updateCount, 1).show();
}
/*
* 通过ContentResolver调用ContentProvider删除一条记录
*/
public void delete(View v) {
//1. 得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2. 执行delete
Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
int deleteCount = resolver.delete(uri, null, null);
Toast.makeText(this, "deleteCount="+deleteCount, 1).show();
}
/*
* 通过ContentResolver调用ContentProvider查询所有记录
*/
public void query(View v) {
//1. 得到ContentResolver对象
ContentResolver resolver = getContentResolver();
//2. 调用其query, 得到cursor
Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/1");
uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
Cursor cusor = resolver.query(uri, null, null, null, null);
//3. 取出cursor中的数据, 并显示
while(cusor.moveToNext()) {
int id = cusor.getInt(0);
String name = cusor.getString(1);
Toast.makeText(this, id+" : "+name, 1).show();
}
cusor.close();
}
}
package com.atguigu.l09_provider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
super(context, "atguigu.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.e("TAG", "onCreate()...");
//建表
db.execSQL("create table person(_id integer primary key autoincrement, name varchar)");
//插入初始化数据
db.execSQL("insert into person (name) values ('Tom')");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
package com.atguigu.l09_provider;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;
/**
* 操作person表的provider类
* @author 张晓飞
*
*/
public class PersonProvider extends ContentProvider {
//用来存放所有合法的Uri的容器
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
//保存一些合法的uri
// content://com.atguigu.l09_provider.personprovider/person 不根据id操作
// content://com.atguigu.l09_provider.personprovider/person/3 根据id操作
static {
matcher.addURI("com.atguigu.l09_provider.personprovider", "/person", 1);
matcher.addURI("com.atguigu.l09_provider.personprovider", "/person/#", 2); //#匹配任意数字
}
private DBHelper dbHelper;
public PersonProvider() {
Log.e("TAG", "PersonProvider()");
}
@Override
public boolean onCreate() {
Log.e("TAG", "PersonProvider onCreate()");
dbHelper = new DBHelper(getContext());
return false;
}
/**
* content://com.atguigu.l09_provider.personprovider/person 不根据id查询
* content://com.atguigu.l09_provider.personprovider/person/3 根据id查询
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.e("TAG", "PersonProvider query()");
//得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
//1.匹配uri, 返回code
int code = matcher.match(uri);
//如果合法, 进行查询
if(code==1) {//不根据id查询
Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null);
return cursor;
} else if(code==2) {//根据id查询
//得到id
long id = ContentUris.parseId(uri);
//查询
Cursor cursor = database.query("person", projection, "_id=?", new String[]{id+""}, null, null, null);
return cursor;
} else {//如果不合法, 抛出异常
throw new RuntimeException("查询的uri不合法");
}
}
/**
* content://com.atguigu.l09_provider.personprovider/person 插入
* content://com.atguigu.l09_provider.personprovider/person/3 根据id插入(没有)
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.e("TAG", "PersonProvider insert()");
//得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
//匹配uri, 返回code
int code = matcher.match(uri);
//如果合法, 进行插入
if(code==1) {
long id = database.insert("person", null, values);
//将id添加到uri中
uri = ContentUris.withAppendedId(uri, id);
database.close();
return uri;
} else {
//如果不合法, 抛出异常
database.close();
throw new RuntimeException("插入的uri不合法");
}
}
/**
* content://com.atguigu.l09_provider.personprovider/person 不根据id删除
* content://com.atguigu.l09_provider.personprovider/person/3 根据id删除
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.e("TAG", "PersonProvider delete()");
//得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
//匹配uri, 返回code
int code = matcher.match(uri);
int deleteCount = -1;
//如果合法, 进行删除
if(code==1) {
deleteCount = database.delete("person", selection, selectionArgs);
} else if(code==2) {
long id = ContentUris.parseId(uri);
deleteCount = database.delete("person", "_id="+id, null);
} else {
//如果不合法, 抛出异常
database.close();
throw new RuntimeException("删除的uri不合法");
}
database.close();
return deleteCount;
}
/**
* content://com.atguigu.l09_provider.personprovider/person 不根据id更新
* content://com.atguigu.l09_provider.personprovider/person/3 根据id更新
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
Log.e("TAG", "PersonProvider update()");
//得到连接对象
SQLiteDatabase database = dbHelper.getReadableDatabase();
//匹配uri, 返回code
int code = matcher.match(uri);
int updateCount = -1;
//如果合法, 进行更新
if(code==1) {
updateCount = database.update("person", values, selection, selectionArgs);
} else if(code==2) {
long id = ContentUris.parseId(uri);
updateCount = database.update("person", values, "_id="+id, null);
} else {
//如果不合法, 抛出异常
database.close();
throw new RuntimeException("更新的uri不合法");
}
database.close();
return updateCount;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
}