在以前的一篇博客中,曾将介绍了如何使用content provider, 如果需要创建你自己的cotent provider,也就是定制自己特有的,你需要做的其实很简单,那就是从抽象类ContentProvider派生出你自己的类,并且实现里面所有的抽象方法,包括:
-
query(Uri, String[], String, String[], String) which returns data to the caller
-
insert(Uri, ContentValues) which inserts new data into the content provider
-
update(Uri, ContentValues, String, String[]) which updates existing data in the content provider
-
delete(Uri, String, String[]) which deletes data from the content provider
- getType(Uri) which returns the MIME type of data in the content provider
在你的content provider里面,你有随意选择存储媒介的权利,你可以用传统文件,xml,甚至是一些特定的web service, 当然你也可以选择用的最为广泛的SQLite
在你自己的类中,你需要定义一个public static final Uri 命名为CONTENT_URI。
具体方法,还是通过一个例子来说明吧
public class BooksProvider extends ContentProvider
{
public static final String PROVIDER_NAME =
"MyContentProvider";
public static final Uri CONTENT_URI =
Uri.parse("content://"+ PROVIDER_NAME + "/books");
public static final String _ID = "_id";
public static final String TITLE = "title";
public static final String ISBN = "isbn";
private static final int BOOKS = 1;
private static final int BOOK_ID = 2;
private static final UriMatcher uriMatcher;
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "books", BOOKS);
uriMatcher.addURI(PROVIDER_NAME, "books/#", BOOK_ID);
}
//---for database use---
private SQLiteDatabase booksDB;
private static final String DATABASE_NAME = "Books";
private static final String DATABASE_TABLE = "titles";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table " + DATABASE_TABLE +
" (_id integer primary key autoincrement, "
+ "title text not null, isbn text not null);";
@Override
public boolean onCreate() {
Context context = getContext();
DatabaseHelper dbHelper = new DatabaseHelper(context);
booksDB = dbHelper.getWritableDatabase();
return (booksDB == null)? false:true;
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion) {
Log.w("Content provider database",
"Upgrading database from version " +
oldVersion + " to " + newVersion +
", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS titles");
onCreate(db);
}
}
@Override
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
//---get all books---
case BOOKS:
return "vnd.android.cursor.dir/vnd.learn2develop.books ";
//---get a particular book---
case BOOK_ID:
return "vnd.android.cursor.item/vnd.learn2develop.books ";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
sqlBuilder.setTables(DATABASE_TABLE);
if (uriMatcher.match(uri) == BOOK_ID)
//---if getting a particular book---
sqlBuilder.appendWhere(
_ID + " = " + uri.getPathSegments().get(1));
if (sortOrder==null || sortOrder=="")
sortOrder = TITLE;
Cursor c = sqlBuilder.query(
booksDB,
projection,
selection,
selectionArgs,
null,
null,
sortOrder);
//---register to watch a content URI for changes---
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
//---add a new book---
long rowID = booksDB.insert(
DATABASE_TABLE, "", values);
//---if added successfully---
if (rowID>0)
{
Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID);
getContext().getContentResolver().notifyChange(_uri,null);
return _uri;
}
throw new SQLException("Failed to insert row into " + uri);
}
@Override
public int delete(Uri arg0, String arg1, String[] arg2) {
// arg0 = uri
// arg1 = selection
// arg2 = selectionArgs
int count=0;
switch (uriMatcher.match(arg0)){
case BOOKS:
count = booksDB.delete(
DATABASE_TABLE,
arg1,
arg2);
break;
case BOOK_ID:
String id = arg0.getPathSegments().get(1);
count = booksDB.delete(
DATABASE_TABLE,
_ID + " = " + id +
(!TextUtils.isEmpty(arg1) ? " AND (" +
arg1 + ')' : ""),
arg2);
break;
default: throw new IllegalArgumentException(
"Unknown URI " + arg0);
}
getContext().getContentResolver().notifyChange(arg0, null);
return count;
}
@Override
public int update(Uri uri, ContentValues values,
String selection, String[] selectionArgs)
{
int count = 0;
switch (uriMatcher.match(uri)){
case BOOKS:
count = booksDB.update(
DATABASE_TABLE,
values,
selection,
selectionArgs);
break;
case BOOK_ID:
count = booksDB.update(
DATABASE_TABLE,
values,
_ID + " = " + uri.getPathSegments().get(1) +
(!TextUtils.isEmpty(selection) ? " AND (" +
selection + ')' : ""),
selectionArgs);
break;
default: throw new IllegalArgumentException(
"Unknown URI " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
}
需要强调一点的是,如果想要建立一个自己的content provider,需要自己建立起一个UriMatcher objects 树。其中UriMatcher是一个android自带的类,用来辅助匹配当前content provider中的URI.
其中建立匹配树,需要调用UriMatcher的addURI方法:
static
{
uriMatcher
=
new
UriMatcher
(
UriMatcher
.
NO_MATCH
);
uriMatcher
.
addURI
(
PROVIDER_NAME
,
"books"
,
BOOKS
);
uriMatcher
.
addURI
(
PROVIDER_NAME
,
"books/#"
,
BOOK_ID
);
}
当需要匹配时,需要调用
uriMatcher.match
方法。
例如:
public String getType(Uri uri) {
switch (uriMatcher.match(uri)){
//---get all books---
case BOOKS:
return "vnd.android.cursor.dir/vnd.learn2develop.books ";
//---get a particular book---
case BOOK_ID:
return "vnd.android.cursor.item/vnd.learn2develop.books ";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
分享到:
相关推荐
在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的...通过学习和实践,开发者可以创建更复杂的Content Provider,支持更多类型的数据和更丰富的操作,从而在Android平台上实现更高效的数据共享。
Content Provider是Android系统提供的一种机制,允许应用程序暴露自己的数据给其他应用,或者获取其他应用公开的数据。它遵循严格的读写权限控制,确保数据的安全性。在这个Demo中,我们将学习如何创建一个基本的...
内容提供者(Content Provider)是Android系统中的一种机制,允许应用程序将自己的数据暴露给其他应用。它是一个实现了标准接口的组件,用于存储和检索数据,使得不同应用之间可以安全地共享数据,即使这些数据存储...
在Android系统中,Content Provider是四大组件之一,它是应用程序间数据共享的核心机制。Content Provider允许一个应用暴露其数据,使得其他应用可以读取或者写入这些数据,甚至跨应用程序进行数据交换。这篇博客...
在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...
Content Provider使得应用程序可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个"android provider"主题中,我们将深入探讨Content Provider的工作原理、实现方式以及如何在实际应用中使用...
在Android开发中,Content Provider是一种重要的组件,它允许应用程序之间共享数据。`content_provider_demo`是一个展示如何创建和使用Content Provider的示例项目。在这个项目中,开发者将学习如何为其他应用提供...
如果你需要共享自定义的数据,可以创建自己的Content Provider。这需要实现ContentProvider类,并覆盖onCreate()、query()、insert()、update()、delete()等方法。 在上述代码示例中,CPTest可能是一个测试应用或...
android content provider两个程序共享数据实例demo。简单的两个应用app之间共享数据。 getContentResolver().insert() getContentResolver().query() getContentResolver().delete() getContentResolver().update()
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,...通过阅读这篇博客,开发者可以深入了解Content Provider的工作原理,以及如何编写自己的Content Provider,从而提升Android开发技能。
在Android应用开发中,Content Provider是一种重要的组件,它允许应用程序之间进行数据共享。Content Provider作为Android系统中的数据接口,能够使一个应用的数据被其他应用访问和操作,这在多应用协同工作或者数据...
这篇博客“简单实现自己的Content Provider(一)”旨在引导开发者如何从零开始构建一个基本的Content Provider。 首先,我们需要理解Content Provider的基本结构。Content Provider由一系列类组成,其中最重要的是...
首先,创建Content Provider需要定义一个继承自`android.content.ContentProvider`的类。在这个类中,我们需要重写以下几个关键方法: 1. `onCreate()`: 当Content Provider被系统加载时调用,用于进行初始化操作。...
首先,我们需要创建一个Content Provider类,它是抽象类`android.content.ContentProvider`的子类。在这个类中,我们需要重写以下几个关键方法: 1. `onCreate()`: 当Content Provider被系统加载时调用,用于初始化...
**Android内容提供者(Content Provider)详解** 在Android系统中,数据共享是应用程序间交互的重要方式,而Android内容提供者(Content Provider)正是实现这一功能的关键组件。Content Provider作为Android四大...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地共享数据。本文将深入探讨如何使用Content Provider组件来访问和操作Android设备上的通讯录,特别是针对...
在Android系统中,Content Provider是一种核心组件,它负责在应用程序之间共享数据。这篇博客"Android学习之通过content provider获得联系人"将引导我们深入理解如何使用Content Provider来访问和操作设备上的联系人...
通过这个案例,你可以学习到如何创建自己的Content Provider,实现跨应用数据共享,这对于开发需要多个应用之间交换数据的Android项目至关重要。同时,掌握Content Provider的使用也能加深对Android系统架构的理解,...
应用程序在需要监听Content Provider数据变化时,会创建一个ContentObserver的实例并注册到ContentResolver。注册过程中,应用程序提供一个回调方法,当数据发生变化时,此方法会被触发。ContentResolver通过Binder...
创建自定义Content Provider需要继承`android.content.ContentProvider`类,并实现其抽象方法。开发者需要在`onCreate()`方法中初始化数据库,然后重写`query()`, `insert()`, `update()`, `delete()`和`getType()`...