ContentProvider作为android的四大组件之一的一种,一般它的作用往往是用在几个不同app应用间的数据共享,而且它提供给外界访问的接口也是统一的。关于ContentProvider的基本概念,这里我就不一一简述了,关于ContentProvider的描述多如牛毛, 下面我们直接进入主题,通过一个demo实例来看看,ContentProvider到底是通过怎样的途径实现应用间的数据共享的.
新建一个项目工程
首先建立数据源,也就是搭建一个数据库.:
1.定义SQLiteOpenHelper:
package com.example.test;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DbHelper extends SQLiteOpenHelper {
public DbHelper(Context context) {
super(context, "test.db", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT ,name VARCHAR,age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
2. 定义实体类Person:
package com.example.test;
public class Person {
public int id;
public String name;
public int age;
public Person(){}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person(int id, String name, int age) {
super();
this.id = id;
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;
}
}
3.定义SQLite管理类DBManager:
package com.example.test;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class DBManager {
DbHelper dbHelper;
SQLiteDatabase db;
public DBManager(Context context){
dbHelper = new DbHelper(context);
db = dbHelper.getWritableDatabase();
}
public void add(Person person){
db.execSQL("insert into person values(null,?,?)",new Object[]{person.name,person.age});
}
public void deleteAll(){
db.delete("person", null, null);
}
public void update(Person person){
db.execSQL("update person set age = ? where _id = ?", new Object[]{person.age,person.id});
}
public List<Person> queryAll(){
List<Person> persons = new ArrayList<Person>();
Cursor cursor = db.query("person", null, null, null, null, null, null);
while(cursor.moveToNext()){
Person person = new Person();
person.setId(cursor.getInt(cursor.getColumnIndex("_id")));
person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
person.setName(cursor.getString(cursor.getColumnIndex("name")));
persons.add(person);
}
cursor.close();
return persons;
}
}
4.在Manifest.xml中声明Provider:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.test.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:name=".PersonContentProvider" android:authorities="com.test.provider" />
<uses-library android:name="android.test.runner"/>
</application>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.example.test" android:label="Tests for My App"/>
</manifest>
5.定义ContentProvider类 PersonContentProvider:
package com.example.test;
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;
public class PersonContentProvider extends ContentProvider {
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSON_CODE = 1 ;
private static final int PERSON_CODES = 2 ;
static{
URI_MATCHER.addURI("com.test.provider", "person", PERSON_CODES);
URI_MATCHER.addURI("com.test.provider", "person/#", PERSON_CODE);
}
DbHelper dbHelper;
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dbHelper = new DbHelper(this.getContext());
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = null;
switch (URI_MATCHER.match(uri)) {
case PERSON_CODE:
long id = ContentUris.parseId(uri);
String where = " _id = "+id;
if(selection != null){
where += " and "+selection;
}
cursor = db.query("person", null, where, selectionArgs, null, null, sortOrder);
break;
case PERSON_CODES:
cursor = db.query("person", null, null, null, null, null, null);
break;
default:
break;
}
return cursor;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
String type = "";
switch (URI_MATCHER.match(uri)) {
case PERSON_CODE:
type = "vnd.android.cursor.item/person";
break;
case PERSON_CODES:
type = "vnd.android.cursor.dir/person";
break;
default:
break;
}
return type;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
long id = db.insert("person", null, values);
return ContentUris.withAppendedId(uri, id);
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
int type = 0;
switch (URI_MATCHER.match(uri)) {
case PERSON_CODE:
long id = ContentUris.parseId(uri);
String where = " _id ="+id;
if(selection != null){
where += " and "+selection;
}
type = db.delete("person", where, selectionArgs);
break;
case PERSON_CODES:
type = db.delete("person", null, null);
break;
default:
break;
}
return type;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = dbHelper.getWritableDatabase();
int type = 0;
switch (URI_MATCHER.match(uri)) {
case PERSON_CODE:
long id = ContentUris.parseId(uri);
String where = " _id ="+id;
if(selection != null){
where += " and "+selection;
}
type = db.update("person", values, selection, selectionArgs);
break;
case PERSON_CODES:
type = db.update("person", values, null, null);
break;
default:
break;
}
return type;
}
}
6 .新建工程:
1.建立测试类:
package com.example.testcontentprovider;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;
public class Test extends AndroidTestCase {
public void testContentInsert(){
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "shanghai");
values.put("age", 10);
Uri uri = resolver.insert(Uri.parse("content://com.test.provider/person"), values);
Log.e("Test",uri.toString());
}
public void testContentQuery(){
List<Person> persons = new ArrayList<Person>();
ContentResolver resolver = this.getContext().getContentResolver();
Cursor cursor = resolver.query(Uri.parse("content://com.test.provider/person"), null, null, null, null);
while(cursor.moveToNext()){
Person person = new Person();
person.setId(cursor.getInt(cursor.getColumnIndex("_id")));
person.setAge(cursor.getInt(cursor.getColumnIndex("age")));
person.setName(cursor.getString(cursor.getColumnIndex("name")));
persons.add(person);
}
cursor.close();
for (Person person : persons) {
Log.e("Test","id========"+person.getId()+" name========"+person.getName()+" age========"+person.getAge());
}
}
public void testContentUpdate(){
ContentResolver resolver = this.getContext().getContentResolver();
ContentValues values = new ContentValues();
values.put("name", "xiaoming");
int type = resolver.update(Uri.parse("content://com.test.provider/person"), values, null, null);
Log.e("Test","type===="+type);
}
public void testContentDelete(){
ContentResolver resolver = this.getContext().getContentResolver();
int type = resolver.delete(Uri.parse("content://com.test.provider/person/2"), null, null);
Log.e("Test","type===="+type);
}
}