- Content Provider 简介
1、Content provider是用来管理对结构化数据集进行访问的一组接口。这组接口对数据进行封装,并提供了用于定义数据安全的机制。Content provider是一个进程使用另一个进程数据的标准接口。
2、Android系统本身也通过content provider来管理数据,如音频,视频,图像,个人联系信息等。我们可以在android.provider包的参考文档中看到这些provider列表。在一定条件下,这些provider能够访问任何Android应用程序。
3、provider最主要的目的是为了让其他应用程序使用provider的客户端对象访问provider。所以,provider和provider客户端共同提供了一个一致的标准数据接口用来处理进程间通信和安全的数据访问。
- 创建一个ContentProvider
定义ContentProvider继承该类,实现相关方法
1、删除符合指定条件的记录
public int delete(Uri uri,String selection,String[] selectionArgs);
2、插入一个新的记录
public Uri insert(Uri uri,ContentValues values);
3、查询符合指定条件的记录
public Curcor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder);
4、更新条例指定条件的记录
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);
5、创建数据存储后端,如数据库,文件,网络接口等,这里主要进行初始化工作 public boolean onCreate();
6、基于给定URI,返回该URI表示的MIME类型
public String getType(Uri uri);
例子展示(这边更新代码ID设置的是1,由于提前操作过,所以已经把1给删了,所以更新操作没演示出效果,但可用)
MainActivity
import android.content.ContentResolver;
import android.content.ContentUris;
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;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void addClick(View v){
ContentResolver cr=this.getContentResolver();
//conten://com.example.contentprovider.HelloContentProvider/person
//conten://com.example.contentprovider.HelloContentProvider/person/1
//调用CP的添加方法
Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person");
ContentValues values=new ContentValues();
values.put(PersonMetadata.Person.NAME,"ck");
values.put(PersonMetadata.Person.AGE,6);
cr.insert(uri,values);
}
public void deleteClick(View v){
ContentResolver cr=this.getContentResolver();
Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person/2");
cr.delete(uri,null,null);
}
public void updateClick(View v){
ContentResolver cr=this.getContentResolver();
Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person/1");
ContentValues values=new ContentValues();
values.put(PersonMetadata.Person.NAME,"ck");
values.put(PersonMetadata.Person.AGE,20);
cr.update(uri,values,null,null);
}
public void queryClick(View v){
ContentResolver cr=this.getContentResolver();
Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person");
Cursor c=cr.query(uri,null,null,null,null);
while (c.moveToNext()){
System.out.println(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
System.out.println(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
System.out.println(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
}
c.close();
}
}
HelloContentProvider
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;
/**
* 自定义ContentProvider
*/
public class HelloContentProvider extends ContentProvider {
private static final String authority="com.example.contentprovider.HelloContentProvider";
//创建一个URI的匹配器,
private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
private static final int single_code=2;//返回单个记录的匹配码
private static final int mutiple_code=1;//返回多个记录的匹配码
//text/plain image/jpg
private static final String SINGLE_TYPE="vnd.android.cursor.item/person";
private static final String MUTIPLE_TYPE="vnd.android.cursor.dir/person";
static {
//conten://com.example.contentprovider.HelloContentProvider/person
uriMatcher.addURI(authority,"person",mutiple_code);
//conten://com.example.contentprovider.HelloContentProvider/person/1
uriMatcher.addURI(authority,"person/#",single_code);
}
private DatabaseAdapter.DatabaseHelper dbHelper;
@Override
public boolean onCreate() {
dbHelper=new DatabaseAdapter.DatabaseHelper(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder) {
switch (uriMatcher.match(uri)){
case single_code:
SQLiteDatabase db=dbHelper.getReadableDatabase();
long id=ContentUris.parseId(uri);
selection= PersonMetadata.Person._ID+"=?";
selectionArgs=new String[]{String.valueOf(id)};
return db.query(PersonMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
case mutiple_code:
db=dbHelper.getReadableDatabase();
return db.query(PersonMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
}
return null;
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
case single_code:
return SINGLE_TYPE;
case mutiple_code:
return MUTIPLE_TYPE;
}
return null;
}
@Override
public Uri insert(Uri uri,ContentValues values) {
switch (uriMatcher.match(uri)){
case mutiple_code:
SQLiteDatabase db=dbHelper.getWritableDatabase();
long id=db.insert(PersonMetadata.Person.TABLE_NAME,null,values);
uri=ContentUris.withAppendedId(uri,id);
db.close();
break;
}
return uri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri)){
//conten://com.example.contentprovider.HelloContentProvider/person/1
case single_code:
SQLiteDatabase db=dbHelper.getWritableDatabase();
long id=ContentUris.parseId(uri);
selection= PersonMetadata.Person._ID+"=?";
selectionArgs=new String[]{String.valueOf(id)};
int row=db.delete(PersonMetadata.Person.TABLE_NAME,selection,selectionArgs);
db.close();
return row;
case mutiple_code:
db=dbHelper.getWritableDatabase();
row=db.delete(PersonMetadata.Person.TABLE_NAME,selection,selectionArgs);
db.close();
return row;
}
return 0;
}
@Override
public int update( Uri uri, ContentValues values, String selection, String[] selectionArgs) {
switch (uriMatcher.match(uri)){
//conten://com.example.contentprovider.HelloContentProvider/person/1
case single_code:
SQLiteDatabase db=dbHelper.getWritableDatabase();
long id=ContentUris.parseId(uri);
selection= PersonMetadata.Person._ID+"=?";
selectionArgs=new String[]{String.valueOf(id)};
int row=db.update(PersonMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
db.close();
return row;
case mutiple_code:
db=dbHelper.getWritableDatabase();
row=db.update(PersonMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
db.close();
return row;
}
return 0;
}
}
DatabaseAdapter
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
public class DatabaseAdapter {
private DatabaseHelper dbHelper;
public DatabaseAdapter(Context context){
dbHelper=new DatabaseHelper(context);
}
public void save(Person person){
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(PersonMetadata.Person.NAME,person.getName());
values.put(PersonMetadata.Person.AGE,person.getAge());
db.insert(PersonMetadata.Person.TABLE_NAME,null,values);
db.close();
}
public void delete(int id){
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.delete(PersonMetadata.Person.TABLE_NAME, PersonMetadata.Person._ID+"=?",new String[]{String.valueOf(id)});
db.close();
}
public void update(Person person){
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(PersonMetadata.Person.NAME,person.getName());
values.put(PersonMetadata.Person.AGE,person.getAge());
String where=PersonMetadata.Person._ID+"=?";
String[] args={String.valueOf(person.getId())};
db.update(PersonMetadata.Person.TABLE_NAME,values,where,args);
db.close();
}
public ArrayList<Person> findAll(){
SQLiteDatabase db= dbHelper.getReadableDatabase();
Cursor c= db.query(PersonMetadata.Person.TABLE_NAME,null,null,null,null,null,null);
ArrayList<Person> list=new ArrayList<>();
Person person=null;
while (c.moveToNext()){
person=new Person();
person.setId(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
person.setName(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
person.setAge(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
list.add(person);
}
c.close();
db.close();
return list;
}
public Person findById(int id){
SQLiteDatabase db= dbHelper.getReadableDatabase();
Cursor c= db.query(PersonMetadata.Person.TABLE_NAME,null,PersonMetadata.Person._ID+"=?",new String[]{String.valueOf(id)},null,null,null);
Person person=null;
if (c.moveToNext()){
person=new Person();
person.setId(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
person.setName(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
person.setAge(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
}
c.close();
db.close();
return person;
}
public static class DatabaseHelper extends SQLiteOpenHelper{
private static final String DB_NAME="cp.db";
private static final int VERSION=1;
private static final String CREATE_TABLE="CREATE TABLE person(_id integer primary key autoincrement,name text,age int)";
private static final String DROP_TABLE="DROP TABLE IF EXISTS person";
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE);
db.execSQL(CREATE_TABLE);
}
}
}
Person
import java.lang.ref.SoftReference;
public class Person {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
PersonMetadata
import android.provider.BaseColumns;
public final class PersonMetadata {
public static abstract class Person implements BaseColumns {
public static final String TABLE_NAME="person";
public static final String NAME="name";
public static final String AGE="age";
}
}