`
Bauble
  • 浏览: 66953 次
  • 性别: Icon_minigender_1
  • 来自: Mercury
社区版块
存档分类
最新评论

Android18_Content Provider

阅读更多

一、Content Provider基本概念

 

1、ContentProvider为存储和获取数据提供了统一的接口。ContentProvide使用表的形式来组织数据。

 

2、使用ContentProvider可以在不同的应用程序之间共享数据。

 

3、Android为常见的一些数据提供了ContentProvider(包括音频、视频、图片和通讯录等)。

 

ContentProvider所提供的函数:

query(),insert(),update(),delete(),getType(),onCreate()等。

 

二、URI(统一资源标识符)

 

1、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。

 

2、Android所提供的ContentProvider都存放在android.provider包中。

 

三、ContentProvider的实现过程

 

1、定义一个CONTENT_URI常量。

 

2、定义一个类,继承ContentProvider。

 

3、实现query,insert,update,delete,getType和onCreate方法。

 

4、在AndroidManifest.xml当中进行声明。

 

FirstProviderMetaData.java

 

package com.android.activity;

import android.net.Uri;
import android.provider.BaseColumns;
/**
 * 定义contentprovider的常量
 * @author Allorry Zhang
 */
public class FirstProviderMetaData {
	public static final String AUTHORIY = "com.android.activity.FirstContentProvider";
	//数据库名称
	public static final String DATABASE_NAME = "FirstProvider.db";
	//数据库的版本
	public static final int DATABASE_VERSION = 1;
	//表名 
	public static final String USERS_TABLE_NAME = "users";
	
	public static final class UserTableMetaData implements BaseColumns{
		//表名
		public static final String TABLE_NAME = "users";
		//访问该ContentProvider的URI
		public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORIY + "/users");
		//该ContentProvider所返回的数据类型的定义
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.firstprovider.user";
		public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.firstprovider.user";
		//列名
		public static final String USER_NAME = "name";
		//默认的排序方法
		public static final String DEFAULT_SORT_ORDER = "_id desc";
	}
}

  FirstContentProvider.java

 

package com.android.activity;

import java.util.HashMap;

import com.android.activity.FirstProviderMetaData.UserTableMetaData;
import com.android.db.DatabaseHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;

public class FirstContentProvider extends ContentProvider {

	//检查uri是否符合标准,给uri起一个规则,返回数字
	public static final UriMatcher uriMatcher;
	public static final int INCOMING_USER_COLLECTION = 1;
	public static final int INCOMING_USER_SINGLE = 2;
	private DatabaseHelper dh;
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users",
				INCOMING_USER_COLLECTION);
		//#代表id
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users/#",
				INCOMING_USER_SINGLE);
	}
	
	//给列起别名
	public static HashMap<String,String> userProjectionMap;
	static{
		userProjectionMap = new HashMap<String,String>();
		userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
		userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
	}
	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		System.out.println("delete");
		return 0;
	}

	//根据传入的URI,返回该URI所表示的数据类型
	@Override
	public String getType(Uri uri) {
		System.out.println("getType");
		switch(uriMatcher.match(uri)){
			case INCOMING_USER_COLLECTION:
				return UserTableMetaData.CONTENT_TYPE;
			case INCOMING_USER_SINGLE:
				return UserTableMetaData.CONTENT_TYPE_ITEM;
			default:
				throw new IllegalArgumentException("Unknown URI" + uri);
		}
	}

	/**
	 * 该函数的返回值是一个Uri,这个Uri表示的是刚刚使用这个函数所插入的数据
	 * content://mars.cp.FirstContentProvider/users/1
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		System.out.println("insert");
		SQLiteDatabase db = dh.getWritableDatabase();
		long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
		if(rowId > 0){
			Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
			//通知监听器,数据已经改变
			getContext().getContentResolver().notifyChange(insertedUserUri, null);
			return insertedUserUri;
		}
		throw new SQLException("Failed to insert row into" + uri);
	}

	//是一个回调方法,所以说在ContentProvider创建的时候执行 
	@Override
	public boolean onCreate() {
		//打开数据库  
		dh = new DatabaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME);
		System.out.println("onCreate");
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		switch(uriMatcher.match(uri)){
			case INCOMING_USER_COLLECTION:
				qb.setTables(UserTableMetaData.TABLE_NAME);
				qb.setProjectionMap(userProjectionMap);
				break;
			case INCOMING_USER_SINGLE:
				qb.setTables(UserTableMetaData.TABLE_NAME);
				qb.setProjectionMap(userProjectionMap);
				qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
				break;
		}
		String orderBy;
		if(TextUtils.isEmpty(sortOrder)){
			orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
		}
		else{
			orderBy = sortOrder;
		}
		SQLiteDatabase db = dh.getWritableDatabase();
		Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
		c.setNotificationUri(getContext().getContentResolver(), uri);
		System.out.println("query");
		return c;
	}

	@Override
	public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
		System.out.println("update");
		return 0;
	}

}

  ContentProviderActivity.java

 

package com.android.activity;

import java.util.HashMap;

import com.android.activity.FirstProviderMetaData.UserTableMetaData;
import com.android.db.DatabaseHelper;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;

public class FirstContentProvider extends ContentProvider {

	//检查uri是否符合标准,给uri起一个规则,返回数字
	public static final UriMatcher uriMatcher;
	public static final int INCOMING_USER_COLLECTION = 1;
	public static final int INCOMING_USER_SINGLE = 2;
	private DatabaseHelper dh;
	static {
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users",
				INCOMING_USER_COLLECTION);
		//#代表id
		uriMatcher.addURI(FirstProviderMetaData.AUTHORIY, "/users/#",
				INCOMING_USER_SINGLE);
	}
	
	//给列起别名
	public static HashMap<String,String> userProjectionMap;
	static{
		userProjectionMap = new HashMap<String,String>();
		userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
		userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
	}
	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		System.out.println("delete");
		return 0;
	}

	//根据传入的URI,返回该URI所表示的数据类型
	@Override
	public String getType(Uri uri) {
		System.out.println("getType");
		switch(uriMatcher.match(uri)){
			case INCOMING_USER_COLLECTION:
				return UserTableMetaData.CONTENT_TYPE;
			case INCOMING_USER_SINGLE:
				return UserTableMetaData.CONTENT_TYPE_ITEM;
			default:
				throw new IllegalArgumentException("Unknown URI" + uri);
		}
	}

	/**
	 * 该函数的返回值是一个Uri,这个Uri表示的是刚刚使用这个函数所插入的数据
	 * content://mars.cp.FirstContentProvider/users/1
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		System.out.println("insert");
		SQLiteDatabase db = dh.getWritableDatabase();
		long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
		if(rowId > 0){
			Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
			//通知监听器,数据已经改变
			getContext().getContentResolver().notifyChange(insertedUserUri, null);
			return insertedUserUri;
		}
		throw new SQLException("Failed to insert row into" + uri);
	}

	//是一个回调方法,所以说在ContentProvider创建的时候执行 
	@Override
	public boolean onCreate() {
		//打开数据库  
		dh = new DatabaseHelper(getContext(),FirstProviderMetaData.DATABASE_NAME);
		System.out.println("onCreate");
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		switch(uriMatcher.match(uri)){
			case INCOMING_USER_COLLECTION:
				qb.setTables(UserTableMetaData.TABLE_NAME);
				qb.setProjectionMap(userProjectionMap);
				break;
			case INCOMING_USER_SINGLE:
				qb.setTables(UserTableMetaData.TABLE_NAME);
				qb.setProjectionMap(userProjectionMap);
				qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
				break;
		}
		String orderBy;
		if(TextUtils.isEmpty(sortOrder)){
			orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
		}
		else{
			orderBy = sortOrder;
		}
		SQLiteDatabase db = dh.getWritableDatabase();
		Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
		c.setNotificationUri(getContext().getContentResolver(), uri);
		System.out.println("query");
		return c;
	}

	@Override
	public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
		System.out.println("update");
		return 0;
	}

}

  AndroidManifest.xml

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.android.activity"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="10" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".ContentProviderActivity"
                  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="com.android.activity.FirstContentProvider"
				  android:authorities="com.android.activity.FirstContentProvider"></provider>
    </application>
</manifest>
 

  main.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
<Button 
	android:id="@+id/insert"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
	android:text="插入数据"
	/>
<Button 
	android:id="@+id/query"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
	android:text="查询数据"
	/>
</LinearLayout>

 

其实很少能使用到自己定义实现的ContentProvider,平时只要知道API定义好的ContentProvider的使用即可。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Content-Providers(1).rar_android_content provider

    关于Content Providers Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个...把18.SQLite和22.22.Content Provider添加到项目中,先运行18.SQLite,然后在进行22.Content Provider测试

    android中Content Provider

    在Android系统中,Content Provider是四大组件之一,它是应用程序间数据共享的核心机制。Content Provider允许一个应用暴露其数据,使得其他应用可以读取或者写入这些数据,甚至跨应用程序进行数据交换。这篇博客...

    content_provider_demo

    在Android开发中,Content Provider是一种重要的组件,它允许应用程序之间共享数据。`content_provider_demo`是一个展示如何创建和使用Content Provider的示例项目。在这个项目中,开发者将学习如何为其他应用提供...

    Android基础 Content Provider

    **Android基础 Content Provider** 在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、...

    platform_packages_providers_contactsprovider

    总的来说,`platform_packages_providers_contactsprovider`是Android系统中连接应用程序和联系人数据的核心组件,它通过Content Provider接口提供了对联系人数据的强大支持,并且考虑到隐私和安全因素,为用户提供...

    android content provider示例程序(简单记账)

    在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解...

    android 自定义 Content Provider示例

    在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...

    Android Content Provider Demo

    在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本"Android Content Provider Demo"着重于演示如何创建和使用Content Provider来实现跨...

    sms.zip_Android 数据库_android_android sms_sms

    3. **提取短信**:要从Android设备提取短信数据,开发者通常需要创建一个BroadcastReceiver,注册对`android.provider.Telephony.SMS_RECEIVED`广播的监听。当新短信到达时,BroadcastReceiver会接收到广播,并可以...

    Android新手Content Provider获取通讯录,短信,通话记录

    理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。

    android_contact.rar_android_android contact_android-contact_cont

    在Android平台上,获取联系人资料是一项常见的任务,这通常涉及到对Android系统提供的Content Provider机制的使用,特别是Contact Provider。在本教程中,我们将深入探讨如何利用`Provider.Contact`来访问和操作用户...

    Android Source_source_android_

    **Content Provider**:作为数据共享的桥梁,使得不同应用之间可以安全地交换数据。 在“Android Source.xlsx”这个文件中,可能包含了对以上各个模块的详细解析,通过学习这些内容,开发者不仅可以深入理解Android...

    Content Provider获取联系人和图片

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。本篇文章将深入探讨如何利用Content Provider获取联系人和图片,以及相关的知识点。 ...

    Android中使用Content Provider组件访问通讯录中的联系人和添加联系人案例详解

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地共享数据。本文将深入探讨如何使用Content Provider组件来访问和操作Android设备上的通讯录,特别是针对...

    android content provider

    【Android Content Provider】是Android系统中的一个重要组件,它主要用于在应用程序之间共享数据。Content Provider作为Android四大组件之一,为其他应用提供了访问私有数据的标准化接口。通过Content Provider,一...

    android provider

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享和交换的重要角色。Content Provider使得应用程序可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个"android provider...

    android_API.rar_Android API_android

    5. **Content Provider**:Content Provider是Android中数据共享的机制,允许应用程序间的数据共享和访问,比如读写联系人、日历等系统数据。 6. **Broadcast Receiver**:广播接收器可以监听系统或自定义的广播...

    content provider实现数据共享demo(内有两个项目)

    在Android应用开发中,Content Provider是一种重要的组件,它允许应用程序之间进行数据共享。Content Provider作为Android系统中的数据接口,能够使一个应用的数据被其他应用访问和操作,这在多应用协同工作或者数据...

    Content Provider的使用

    在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地交换数据。这篇博客“Content Provider的使用”深入探讨了如何在Android开发中利用Content Provider实现...

    SMS.rar_android_android 收发 短信_android 服务_android 短信_sms

    开发者可以使用ContentResolver和Uri(如`Uri.parse("content://sms/inbox")`)来查询、插入、更新或删除短信。 四、权限管理 在AndroidManifest.xml中,需要声明相应的权限来访问短信功能: 1. `READ_SMS`:读取...

Global site tag (gtag.js) - Google Analytics