- 浏览: 67483 次
- 性别:
- 来自: Mercury
最新评论
一、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的使用即可。
发表评论
文章已被作者锁定,不允许评论。
-
Android40_Dialog
2011-11-14 00:11 2994Dialog是Android常用的对话框控件。AlertDia ... -
Android39_Clock和TimePicker
2011-11-14 00:08 2357一、AnalogClock和DigitalClock ... -
Android38_ImageView和Gallery
2011-11-14 00:07 3609一、ImageView使用方法 ImageVi ... -
Android37_JSON数据解析
2011-11-08 00:14 2344一、JSON介绍 JSON(JavaSc ... -
Android36_Animations使用(四)
2011-11-08 00:14 3416一、LayoutAnimationsContrlller ... -
Android35_Animations使用(三)
2011-11-08 00:13 2649一、AnimationSet的具体使用方法 ... -
Android34_Animations使用(二)
2011-11-08 00:12 1954在代码中使用Animations可以很方便的调试、运行 ... -
Android33_Animations使用(一)
2011-11-08 00:12 2282一、Animations介绍 Anima ... -
Android31_AppWidget使用(二)
2011-11-05 00:09 2504一、PendingIntent介绍 PendingIn ... -
Android30_AppWidget使用(一)
2011-11-05 00:08 2260一、App Widget定义 App ... -
Android32_Notification用法
2011-11-05 00:09 1885Android系统的状态栏(Status Bar)中有一 ... -
Android29_SeekBar和RatingBar
2011-11-02 23:21 2116一、使用SeekBar步骤: SeekB ... -
Android28_ExpandableListActivity
2011-11-02 23:21 1484ExpandableListActivity就是可扩展的 ... -
Android27_AutoCompleteTextView
2011-11-02 23:21 1086一、创建AutoCompleteTextView ... -
Android26_DatePicker
2011-11-02 23:20 1777一、DatePicker和DatePickerDialo ... -
Android25_Spinner使用方法
2011-11-02 23:20 2813一、创建Spinner的步骤 1.在布局 ... -
Android24_Service初步
2011-10-18 22:27 1005一、Service概念 ... -
Android23_Socket编程
2011-10-18 22:19 1505一、什么是Socket Socket是基 ... -
Android22_WIFI网络操作
2011-10-18 22:12 1690一、什么是WIFI WIFI就是一种无线 ... -
Android21_广播机制(二)
2011-10-18 22:00 1002一、注册BroadcastReceiver的方法 ...
相关推荐
关于Content Providers Content Providers 是所有应用程序之间数据存储和检索的一个桥梁,作用是使得各个...把18.SQLite和22.22.Content Provider添加到项目中,先运行18.SQLite,然后在进行22.Content Provider测试
在Android系统中,Content Provider是四大组件之一,它是应用程序间数据共享的核心机制。Content Provider允许一个应用暴露其数据,使得其他应用可以读取或者写入这些数据,甚至跨应用程序进行数据交换。这篇博客...
在Android开发中,Content Provider是一种重要的组件,它允许应用程序之间共享数据。`content_provider_demo`是一个展示如何创建和使用Content Provider的示例项目。在这个项目中,开发者将学习如何为其他应用提供...
**Android基础 Content Provider** 在Android开发中,Content Provider是一个至关重要的组件,它充当了应用程序间数据共享的桥梁。本文将深入探讨Content Provider的基本概念、创建方法、如何进行CRUD(Create、...
总的来说,`platform_packages_providers_contactsprovider`是Android系统中连接应用程序和联系人数据的核心组件,它通过Content Provider接口提供了对联系人数据的强大支持,并且考虑到隐私和安全因素,为用户提供...
在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。这篇博文的示例程序"android content provider示例程序(简单记账)"旨在帮助开发者理解...
在Android开发中,Content Provider是四大组件之一,它充当了数据共享和交换的桥梁,使得不同的应用程序之间可以安全地共享数据。本示例将详细解析如何自定义Content Provider,以便在Android应用间实现数据共享。 ...
在Android开发中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地访问和操作数据。本"Android Content Provider Demo"着重于演示如何创建和使用Content Provider来实现跨...
3. **提取短信**:要从Android设备提取短信数据,开发者通常需要创建一个BroadcastReceiver,注册对`android.provider.Telephony.SMS_RECEIVED`广播的监听。当新短信到达时,BroadcastReceiver会接收到广播,并可以...
理解Content Uri的概念和作用,掌握通过Content Provider访问联系人的方法,掌握通过Content Provider访问通话记录的方法,掌握通过Content Provider访问短信的方法。
在Android平台上,获取联系人资料是一项常见的任务,这通常涉及到对Android系统提供的Content Provider机制的使用,特别是Contact Provider。在本教程中,我们将深入探讨如何利用`Provider.Contact`来访问和操作用户...
**Content Provider**:作为数据共享的桥梁,使得不同应用之间可以安全地交换数据。 在“Android Source.xlsx”这个文件中,可能包含了对以上各个模块的详细解析,通过学习这些内容,开发者不仅可以深入理解Android...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地访问和操作数据。本篇文章将深入探讨如何利用Content Provider获取联系人和图片,以及相关的知识点。 ...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序间可以安全地共享数据。本文将深入探讨如何使用Content Provider组件来访问和操作Android设备上的通讯录,特别是针对...
【Android Content Provider】是Android系统中的一个重要组件,它主要用于在应用程序之间共享数据。Content Provider作为Android四大组件之一,为其他应用提供了访问私有数据的标准化接口。通过Content Provider,一...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享和交换的重要角色。Content Provider使得应用程序可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在这个"android provider...
5. **Content Provider**:Content Provider是Android中数据共享的机制,允许应用程序间的数据共享和访问,比如读写联系人、日历等系统数据。 6. **Broadcast Receiver**:广播接收器可以监听系统或自定义的广播...
在Android应用开发中,Content Provider是一种重要的组件,它允许应用程序之间进行数据共享。Content Provider作为Android系统中的数据接口,能够使一个应用的数据被其他应用访问和操作,这在多应用协同工作或者数据...
在Android系统中,Content Provider是四大组件之一,它扮演着数据共享的角色,使得不同应用程序之间可以安全地交换数据。这篇博客“Content Provider的使用”深入探讨了如何在Android开发中利用Content Provider实现...
开发者可以使用ContentResolver和Uri(如`Uri.parse("content://sms/inbox")`)来查询、插入、更新或删除短信。 四、权限管理 在AndroidManifest.xml中,需要声明相应的权限来访问短信功能: 1. `READ_SMS`:读取...