`
yaku2688
  • 浏览: 89970 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android共享数据ContentProvider的使用

阅读更多

ContentProvider数据共享

1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content

<provider android:name=".UserProvider" android:authorities="com.yaku.ContentProvider.userprovider"/>

 ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名

 

2.Url解析
content://com.yaku.ContentProvider.userprovider/user/2
【content://】 Android定义的内容提供都的Schema
【com.yaku.ContentProvider.userprovider】  主机名或者authorities
【user】  路径
【2】 ID

 

示例代码:

数据结构User.java:

package com.yaku.pojo;

public class User {
	private int id;
	private String name;
	private int age;
	
	public User(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;
	}
	@Override
	public String toString() {
		return "User [age=" + age + ", id=" + id + ", name=" + name + "]";
	}
}

 

数据库操作DBOpenHelper.java:

package com.yaku.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {
	private static final String DBNAME = "yaku.db"; //数据库名称
	private static final int DBVER = 1;//数据库版本
	
	public DBOpenHelper(Context context) {
		super(context, DBNAME, null, DBVER);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)";
		db.execSQL(sql);//执行有更改的sql语句
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
		db.execSQL("DROP TABLE IF EXISTS user");
		onCreate(db);
	}

}

 

对外共享处理类ContentProviderUser.java:

package com.yaku.ContentProvider;

import com.yaku.db.DBOpenHelper;

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 ContentProviderUser extends ContentProvider {
	private DBOpenHelper dbOpenHelper;
	//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
	private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
	private static final int USERS = 1;
	private static final int USER = 2;
	static{
		//如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
		MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS);
		//如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
		MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符
	}	
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int count = 0;
		switch (MATCHER.match(uri)) {
		case USERS:
			count = db.delete("user", selection, selectionArgs);
			return count;
		case USER:
			//ContentUris类用于获取Uri路径后面的ID部分
			long id = ContentUris.parseId(uri);
			String where = "userid = "+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			count = db.delete("user", where, selectionArgs);
			return count;
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	/**
	 * 该方法用于返回当前Url所代表数据的MIME类型。
	 * 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
	 * 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
	 */
	@Override
	public String getType(Uri uri) {
		switch (MATCHER.match(uri)) {
		case USERS:			
			return "vnd.android.cursor.dir/user";
			
		case USER:			
			return "vnd.android.cursor.item/user";
			
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		switch (MATCHER.match(uri)) {
		case USERS:
			long rowid = db.insert("user", "name", values); 
			Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Uri
			this.getContext().getContentResolver().notifyChange(uri, null);
			return insertUri;

		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public boolean onCreate() {
		this.dbOpenHelper = new DBOpenHelper(this.getContext());
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		switch (MATCHER.match(uri)) {
		case USERS:
			return db.query("user", projection, selection, selectionArgs, null, null, sortOrder);
		case USER:
			long id = ContentUris.parseId(uri);
			String where = "userid = "+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			return db.query("user", projection, where, selectionArgs, null, null, sortOrder);
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		int count = 0;
		switch (MATCHER.match(uri)) {
		case USERS:
			count = db.update("person", values, selection, selectionArgs);
			return count;
		case USER:
			long id = ContentUris.parseId(uri);
			String where = "userid = "+ id;
			if(selection!=null && !"".equals(selection)){
				where = selection + " and " + where;
			}
			count = db.update("user", values, where, selectionArgs);
			return count;
		default:
			throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());
		}
	}
}

 

单元测试类(在另一个应用中):

 

package com.yaku.ContentProvider;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;

/**
 * 对ContentProvider工程中的ContentProviderActivity进行单元测试
 */
public class ContentProviderActivityTest extends AndroidTestCase {
	private static final String TAG = "ContentProvider";
	//往内容提供者添加数据
	public void testInsert() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
		ContentValues values = new ContentValues();
		values.put("name", "道长");
		values.put("age", 86);
		Uri uri = contentResolver.insert(insertUri, values);
		Log.i(TAG, uri.toString());
	}
	
	//更新内容提供者中的数据
	public void testUpdate() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
		ContentValues values = new ContentValues();
		values.put("name", "青眉道长");
		contentResolver.update(updateUri, values, null, null);
	}
	
	//从内容提供者中删除数据
	public void testDelete() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
		contentResolver.delete(deleteUri, null, null);
	}
	
	//获取内容提供者中的数据
	public void testFind() throws Throwable{
		ContentResolver contentResolver = this.getContext().getContentResolver();
		Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
		Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
		while(cursor.moveToNext()){
			int id = cursor.getInt(cursor.getColumnIndex("userid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			int age = cursor.getInt(cursor.getColumnIndex("age"));
			Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
		}
	}
	
}

 

监听数据的变化:

package com.yaku.ContentProvider;

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 OtherContentProviderTest extends AndroidTestCase {
	private static final String TAG = "OtherContentProvider";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
        ContentResolver contentResolver = this.getContentResolver();
        //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
        contentResolver.registerContentObserver(insertUri, true, new PersonObserver(new Handler()));
    }
    
    private final class PersonObserver extends ContentObserver{
		public PersonObserver(Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			ContentResolver contentResolver = getContentResolver();
			Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
			Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");
			while(cursor.moveToNext()){
				int id = cursor.getInt(cursor.getColumnIndex("userid"));
				String name = cursor.getString(cursor.getColumnIndex("name"));
				int age = cursor.getInt(cursor.getColumnIndex("age"));
				Log.i(TAG, "id="+ id + ",name="+ name+ ",age="+ age);
			}
		}
    }
}

 

分享到:
评论

相关推荐

    android 数据共享(ContentProvider)

    总结来说,ContentProvider是Android平台中实现数据共享的关键组件,通过定义Uri、注册到Manifest以及重写核心方法,我们可以创建一个能够跨应用共享数据的ContentProvider。同时,配合CursorLoader和LoaderManager...

    Android+Room+ContentProvider

    ContentProvider是Android系统中用于数据共享的一种机制,它可以使得应用的数据对其他应用可见并可操作。通过ContentProvider,我们可以实现跨应用的数据交换,比如联系人、日历等系统数据就是通过ContentProvider...

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    Android 之 自定义ContentProvider的使用

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的角色。自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在...

    使用ContentProvider共享数据

    "使用ContentProvider共享数据"这个主题涉及到如何构建和使用ContentProvider来开放数据库,以及如何通过ContentResolver来执行对这些共享数据的操作。 首先,理解ContentProvider的结构至关重要。ContentProvider...

    android-关于ContentProvider的使用例子

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享的重要角色。ContentProvider使得应用程序之间能够安全、有序地访问彼此的数据,无论是系统内置的数据(如联系人、日历等)还是自定义的数据存储...

    android程序间数据的共享(ContentProvider和ContentResolver的使用)

    首先,ContentProvider是Android四大组件之一,它作为数据存储和访问的桥梁,允许不同应用之间共享数据。ContentProvider基于URI(统一资源标识符)来暴露数据,并通过标准的CRUD(创建、读取、更新、删除)操作管理...

    疯狂android资料:第九章使用ContentProvider实现数据共享.doc

    * 数据共享:ContentProvider 允许不同的应用程序之间共享数据,从而实现数据的共享和重用。 * 数据安全:ContentProvider 可以对数据进行保护,以免其他应用程序未经授权地访问数据。 * 灵活性:ContentProvider ...

    ContentProvider数据共享

    在Android系统中,ContentProvider是实现应用程序间数据共享的核心组件。它允许一个应用将自己的数据集公开,让其他应用可以通过标准的ContentResolver接口进行访问。这种机制使得数据可以在多个应用之间透明地共享...

    android 用ContentProvider操作文件

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据,而无需直接访问对方的内部存储。在本教程中,我们将深入探讨如何利用ContentProvider来操作文件,以及其在跨应用数据传输中的作用。 ...

    Android学习 ContentProvider数据更新与Observer模式.doc

    ContentProvider作为Android系统中数据共享的桥梁,允许不同的应用程序之间交换数据,而Observer模式则是一种设计模式,用于实现实时数据同步和更新。 **ContentProvider**是Android框架的一部分,它提供了一种标准...

    ContentProvider共享数据的使用

    在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享和访问数据。ContentProvider封装了数据存储的方式,使得不同的应用可以透明地读写数据,而无需关心数据具体是如何存储的,例如SQLite...

    android contentprovider使用示例

    当多个应用需要共享数据时,ContentProvider是最佳选择。但是,对于私有数据或者敏感信息,应谨慎使用,确保数据的安全性和隐私性。 总结,ContentProvider在Android中扮演着重要的角色,它使应用程序之间的数据...

    使用contentprovider共享生词本数据

    在Android开发中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。本篇文章将深入探讨如何使用ContentProvider来共享生词本数据。首先,我们来看看什么是ContentProvider。 ContentProvider是...

    实验8 contentProvider共享数据1

    `ContentProvider`是Android系统中用于不同应用程序间共享数据的一种核心组件。在本实验中,我们将学习如何创建和使用`ContentProvider`,以及如何通过`ContentResolver`和`ContentObserver`来与`ContentProvider`...

    android 创建数据库contentprovider

    在Android系统中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。`android 创建数据库contentprovider`这个主题主要涉及如何创建一个自定义的ContentProvider来管理数据库中的数据,并实现跨应用的...

    Android应用开发使用ContentProvider以及SQLite实现对数据库的相关操作

    ContentProvider则是Android框架提供的一种机制,用于在应用程序之间共享数据,同时也可用于管理SQLite数据库。接下来,我们将深入探讨如何使用ContentProvider和SQLite在Android应用中执行数据库操作。 首先,...

    采用ContentProvider对外共享数据

    本篇将深入探讨如何使用ContentProvider对外共享数据以及如何监听内容提供者中的数据变化。 一、ContentProvider基础 ContentProvider是Android四大组件之一,它负责管理应用程序的数据,并提供统一的接口供其他...

    Android-Intent-数据存取-ContentProvider.doc

    ContentProvider 是 Android 中的一种机制,用于在不同的应用程序之间共享数据。ContentProvider 提供了一个统一的接口,用于访问和操作数据,使得不同的应用程序可以访问和操作同一份数据。 * ContentProvider 的...

Global site tag (gtag.js) - Google Analytics