android ContentProvider简单实现不同应用间的数据共享

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值