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

Android开发ContentProvider

阅读更多
Content Provider是Android四大组件之一,其主要作用是作为内容(数据)提供方存在,可以用于解决Android进程间数据的共享;
Android中内置了一些Provider,这些Provider提供着一些常用的数据,比如联系人信息等,在这里主要讨论如何在Android中开发自己的Provider;
在Android中开发自己的Provider需要以下的几步:
1)规划数据库、URI、列名称,创建元数据类来定义这些元数据元素的常量;
2)扩展抽象类ContentProvider,设置列映射,URI匹配和实现SQLiteOpenHelper;
3)实现方法:query、insert、update、delete和getType;
4)在描述文件中注册Provider;
代码如下:
1)规划数据库、URI等元数据
package main.app.provider;

import android.net.Uri;
import android.provider.BaseColumns;

public class BookProviderMetaData {
	public static final String AUTHORITY = "main.app.provider.BookProvider";
	public static final String DATABASE_NAME = "book.db";
	public static final int DATABASE_VERSION = 1;
	public static final String BOOKS_TABLE_NAME = "books";

	private BookProviderMetaData() {
	}

	public static final class BookTableMetaData implements BaseColumns {
		private BookTableMetaData() {
		}

		public static final String TABLE_NAME = "books";
		public static final Uri CONTENT_URI = Uri.parse("content://"
				+ AUTHORITY + "/books");
		public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.android.book";
		public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.android.book";
		public static final String DEFAULT_SORT_ORDER = "modified DESC";

		public static final String BOOK_NAME = "name";
		public static final String BOOK_ISBN = "isbn";
		public static final String BOOK_AUTHOR = "author";
		public static final String CREATED_DATE = "created";
		public static final String MODIFIED_DATE = "modified";
	}
}

注:Provider使用的MIME类型需要记住以下几点:
  • 类型和子类型所标示的内容必须是唯一的,类型基本确定为项目录或者单个项,Android中返回项集合的类型应该始终为vnd.android.cursor.dir,单个项使用的类型应该始终为vnd.android.cursor.item;
  • 如果类型和子类型不是标准的,则需要在它们之前添加vnd;
  • 通常针对具体需求添加命名空间;



2)扩展抽象类,设置列映射,URI匹配和实现SQLiteOpenHelper:
 // 设置列投影
	private static HashMap<String, String> sBookProjectionMap;
	static {
		sBookProjectionMap = new HashMap<String, String>();
		sBookProjectionMap.put(BookTableMetaData._ID, BookTableMetaData._ID);
		sBookProjectionMap.put(BookTableMetaData.BOOK_NAME,
				BookTableMetaData.BOOK_NAME);
		sBookProjectionMap.put(BookTableMetaData.BOOK_ISBN,
				BookTableMetaData.BOOK_ISBN);
		sBookProjectionMap.put(BookTableMetaData.BOOK_AUTHOR,
				BookTableMetaData.BOOK_AUTHOR);
		sBookProjectionMap.put(BookTableMetaData.CREATED_DATE,
				BookTableMetaData.CREATED_DATE);
		sBookProjectionMap.put(BookTableMetaData.MODIFIED_DATE,
				BookTableMetaData.MODIFIED_DATE);
	}
	// 设置UriMatcher
	private static final UriMatcher sUriMatcher;
	private static final int INCOMING_BOOK_COLLECTION_URI_INDICATOR = 1;
	private static final int INCOMING_SINGLE_BOOK_URI_INDICATOR = 2;
	static {
		sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books",
				INCOMING_BOOK_COLLECTION_URI_INDICATOR);
		sUriMatcher.addURI(BookProviderMetaData.AUTHORITY, "books/#",
				INCOMING_SINGLE_BOOK_URI_INDICATOR);
	}
	// 创建数据库
	private DatabaseHelper mOpenHelper;

	private static class DatabaseHelper extends SQLiteOpenHelper {

		public DatabaseHelper(Context context) {
			super(context, BookProviderMetaData.DATABASE_NAME, null,
					BookProviderMetaData.DATABASE_VERSION);
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL("CREATE TABLE IF NOT EXISTS "
					+ BookTableMetaData.TABLE_NAME + " ("
					+ BookTableMetaData._ID + " INTEGER PRIMARY KEY, "
					+ BookTableMetaData.BOOK_NAME + " TEXT, "
					+ BookTableMetaData.BOOK_ISBN + " TEXT, "
					+ BookTableMetaData.BOOK_AUTHOR + " TEXT, "
					+ BookTableMetaData.CREATED_DATE + " INTEGER, "
					+ BookTableMetaData.MODIFIED_DATE + " INTEGER" + ");");
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w("DB", "Upgrade database from " + oldVersion + " to "
					+ newVersion + ", which will destory all old data!");
			db.execSQL("DROP TABLE IF EXISTS " + BookTableMetaData.TABLE_NAME);
			onCreate(db);
		}
	}

3)实现方法:query、insert、update、delete和getType:
 @Override
	public int delete(Uri uri, String where, String[] whereArgs) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		int count = 0;
		switch (sUriMatcher.match(uri)) {
		case INCOMING_BOOK_COLLECTION_URI_INDICATOR:
			count = db.delete(BookTableMetaData.TABLE_NAME, where, whereArgs);
			break;
		case INCOMING_SINGLE_BOOK_URI_INDICATOR:
			String rowId = uri.getPathSegments().get(1);
			count = db.delete(
					BookTableMetaData.TABLE_NAME,
					BookTableMetaData._ID
							+ "="
							+ rowId
							+ (!TextUtils.isEmpty(where) ? " AND (" + where
									+ ")" : ""), whereArgs);
			break;
		default:
			throw new IllegalArgumentException("Unknown Uri: " + uri);
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

	// 根据Uri确定返回的MIME类型
	@Override
	public String getType(Uri uri) {
		switch (sUriMatcher.match(uri)) {
		case INCOMING_BOOK_COLLECTION_URI_INDICATOR:
			return BookTableMetaData.CONTENT_TYPE;
		case INCOMING_SINGLE_BOOK_URI_INDICATOR:
			return BookTableMetaData.CONTENT_ITEM_TYPE;
		default:
			throw new IllegalArgumentException("Unknown URI: " + uri);
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		if (sUriMatcher.match(uri) == INCOMING_BOOK_COLLECTION_URI_INDICATOR) {
			throw new IllegalArgumentException("Unknown Uri: " + uri);
		}
		Long now = Long.valueOf(System.currentTimeMillis());
		if (!values.containsKey(BookTableMetaData.CREATED_DATE)) {
			values.put(BookTableMetaData.CREATED_DATE, now);
		}
		if (!values.containsKey(BookTableMetaData.MODIFIED_DATE)) {
			values.put(BookTableMetaData.MODIFIED_DATE, now);
		}
		if (!values.containsKey(BookTableMetaData.BOOK_NAME)) {
			throw new IllegalArgumentException(
					"Fail to insert row because Book Name is needed " + uri);
		}
		if (!values.containsKey(BookTableMetaData.BOOK_ISBN)) {
			values.put(BookTableMetaData.BOOK_ISBN, "Unknown ISBN");
		}
		if (!values.containsKey(BookTableMetaData.BOOK_AUTHOR)) {
			values.put(BookTableMetaData.BOOK_AUTHOR, "Unknown Author");
		}
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		Long rowId = db.insert(BookTableMetaData.TABLE_NAME,
				BookTableMetaData.BOOK_NAME, values);
		if (rowId > 0) {
			Uri insertedBookUri = ContentUris.withAppendedId(
					BookTableMetaData.CONTENT_URI, rowId);
			getContext().getContentResolver().notifyChange(insertedBookUri,
					null);
			return insertedBookUri;
		}
		throw new SQLException("Failed to insert row into " + uri);
	}

	@Override
	public boolean onCreate() {
		mOpenHelper = new DatabaseHelper(getContext());
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
		qb.setTables(BookTableMetaData.TABLE_NAME);
		qb.setProjectionMap(sBookProjectionMap);
		switch (sUriMatcher.match(uri)) {
		case INCOMING_BOOK_COLLECTION_URI_INDICATOR:
			break;
		case INCOMING_SINGLE_BOOK_URI_INDICATOR:
			qb.appendWhere(BookTableMetaData._ID + "="
					+ uri.getPathSegments().get(1));
			break;
		default:
			throw new IllegalArgumentException("Unknown Uri: " + uri);
		}
		String orderBy;
		if (TextUtils.isEmpty(sortOrder)) {
			orderBy = BookTableMetaData.DEFAULT_SORT_ORDER;
		} else {
			orderBy = sortOrder;
		}
		SQLiteDatabase db = mOpenHelper.getReadableDatabase();
		Cursor c = qb.query(db, projection, selection, selectionArgs, null,
				null, orderBy);
		// int i = c.getCount();
		c.setNotificationUri(getContext().getContentResolver(), uri);
		return c;
	}

	@Override
	public int update(Uri uri, ContentValues values, String where,
			String[] whereArgs) {
		SQLiteDatabase db = mOpenHelper.getWritableDatabase();
		int count = 0;
		switch (sUriMatcher.match(uri)) {
		case INCOMING_BOOK_COLLECTION_URI_INDICATOR:
			count = db.update(BookTableMetaData.TABLE_NAME, values, where,
					whereArgs);
			break;
		case INCOMING_SINGLE_BOOK_URI_INDICATOR:
			String rowId = uri.getPathSegments().get(1);
			count = db.update(
					BookTableMetaData.TABLE_NAME,
					values,
					BookTableMetaData._ID
							+ "="
							+ rowId
							+ (!TextUtils.isEmpty(where) ? " AND (" + where
									+ ")" : ""), whereArgs);
			break;
		default:
			throw new IllegalArgumentException("Unknown Uri: " + uri);
		}
		getContext().getContentResolver().notifyChange(uri, null);
		return count;
	}

4)在描述文件中注册Provider:
        <provider
            android:name=".provider.BookProvider"
            android:authorities="main.app.provider.BookProvider" >
        </provider>
分享到:
评论

相关推荐

    android开发contentprovider

    很好的android开发contentprovider例子。

    android开发contentprovider教学ppt(内部资料).pptx

    在Android开发中,ContentProvider是四大核心组件之一,它扮演着跨应用数据共享的角色。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,实现数据的透明访问。本篇内容将深入讲解ContentProvider的...

    android开发ContentProvider(增删改查)实例

    同我前面的资源一样,我的每个功能的实例都是力图实现最简短话...这个实例不讲求大而全的实现ContentProvider的所有功能,而只是为了便于理解而实现。对应于我的博客“How:ContentProvider基本功能核心框架(增删改查)”

    Android+Room+ContentProvider

    在Android应用开发中,数据持久化是一个至关重要的环节,而Android Room和ContentProvider是其中的两个关键组件。本文将深入探讨这两个技术,并结合实际案例,解释如何在Android应用中使用它们来管理和共享SQLite...

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

    在Android应用开发中,数据库管理是一项关键任务,用于存储和检索应用程序所需的数据。SQLite是一个轻量级、嵌入式的关系型数据库,它是Android系统默认支持的数据库系统。ContentProvider则是Android框架提供的一种...

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

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

    从头学Android之ContentProvider示例源代码

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享和访问的桥梁,使得不同应用程序之间可以安全地共享数据。本示例源代码旨在帮助初学者理解ContentProvider的工作原理及其使用方法。通过分析和...

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

    在Android开发中,ContentProvider和Observer模式是两个关键的概念,它们在数据管理和更新中起着重要作用。ContentProvider作为Android系统中数据共享的桥梁,允许不同的应用程序之间交换数据,而Observer模式则是一...

    android 自定义 ContentProvider 以及 ContentResolver

    在Android开发中,ContentProvider和ContentResolver是两个关键组件,它们构成了Android系统中不同应用程序间数据共享的基础。本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作...

    Android ContentProvider全面解析

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以将自己的数据结构暴露...理解并熟练运用ContentProvider,能极大地提升开发效率和应用的扩展性。

    Android之ContentProvider事例

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。ContentProvider使得应用程序可以安全地分享内部数据,同时也为其他应用程序提供了一种标准接口来访问这些数据,无论是SQLite...

    Android中用ContentProvider快速查找通讯录信息的代码清单.pdf

    在Android开发中,ContentProvider是实现应用程序间数据共享的关键组件。它遵循统一的接口标准,使得数据能够在不同的应用之间透明地访问。这篇资料主要讲解如何使用ContentProvider快速查找和访问设备上的通讯录...

    android中contentprovider通讯录

    在Android系统中,ContentProvider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全、方便地访问和...掌握ContentProvider的使用,有助于提升Android开发能力,更好地设计和实现复杂的应用场景。

    android ContentProvider Demo

    在Android开发中,ContentProvider是一种重要的组件,它允许应用程序之间共享数据。本示例"android ContentProvider Demo"将深入探讨如何创建和使用ContentProvider来实现跨应用的数据交换。ContentProvider作为...

    android自定义contentprovider

    在Android开发中,ContentProvider是一种核心组件,它允许应用程序间共享数据。ContentProvider构建于Android的URI机制之上,为其他应用提供了结构化的数据访问接口。本篇将详细讲解如何自定义ContentProvider,以及...

    android_contentprovider_system.rar

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的重要角色。本资源“android_contentprovider_system.rar”提供了一个关于ContentProvider的详细讲解和示例代码,旨在帮助...

    Android ContentProvider简单实现

    在Android开发中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和共享数据。本篇文章将详细介绍如何在Android中实现一个简单的ContentProvider。 首先,理解...

    Android 之 ContentProvider手机簿使用

    在Android系统中,ContentProvider是四大组件之一,它充当了数据共享的桥梁,使得不同的应用程序之间可以安全地访问和操作彼此的数据。...学习这部分内容对于开发涉及数据交互的Android应用具有非常实际的意义。

    mars—第一季android——contentProvider

    在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和跨应用数据访问的重要角色。本教程“mars—第一季android——contentProvider”聚焦于如何利用ContentProvider来实现不同应用程序之间的数据...

Global site tag (gtag.js) - Google Analytics