`
kaozjlin
  • 浏览: 115190 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

ContentProvider简介

阅读更多

一、ContentProvider简介

       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

 

二、Uri类简介

       Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider2.ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:


       1.schemeContentProvider(内容提供者)的scheme已经由Android所规定为:content://

       2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

       3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

·         要操作contact表中id10的记录,可以构建这样的路径:/contact/10

·         要操作contact表中id10的记录的name字段, contact/10/name

·         要操作contact表中的所有记录,可以构建这样的路径:/contact

 

       要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

 

三、UriMatcherContentUristContentResolver简介

       因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcherContentUris 。掌握它们的使用,会便于我们的开发工作。

 

       UriMatcher用于匹配Uri,它的用法如下:

       1.首先把你需要匹配Uri路径全部给注册上,如下:

       //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)

       UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

       //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1

       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

       //如果match()方法匹配   content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2

       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

      

       2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1

 

       ContentUris用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

·         withAppendedId(uri, id)用于为路径加上ID部分

·         parseId(uri)方法用于从路径中获取ID部分

 

       ContentResolver当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insertdeleteupdatequery方法,来操作数据。

 

四、ContentProvider示例程序

       我们为昨天的SQLite示例程序添加一个ContentProvider,供其他应用来访问我们的数据。

 

       1.SQLite示例程序添加ContentProvider

package com.changcheng.sqlite.provider;

 

import com.changcheng.sqlite.MyOpenHelper;

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 ContactContentProvider extends ContentProvider {

 

         // 通过UriMatcher匹配外部请求

         private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

         // 通过openHelper进行数据库读写

         private MyOpenHelper openHelper;

         // 匹配状态常量

         private static final int CONTACT_LIST = 1;

         private static final int CONTACT = 2;

         // 表名

         private static final String tableName = "contacts";

         // 添加Uri

         static {

                   uriMatcher.addURI("com.changcheng.sqlite.provider", "contact",

                                     CONTACT_LIST);

                   uriMatcher.addURI("com.changcheng.sqlite.provider", "contact/#",

                                     CONTACT);

         }

 

         @Override

         public int delete(Uri uri, String selection, String[] selectionArgs) {

                   SQLiteDatabase db = this.openHelper.getWritableDatabase();

                  int result;

                   switch (uriMatcher.match(uri)) {

                   case CONTACT_LIST:

                            result = db.delete(tableName, selection, selectionArgs);

                            break;

                   case CONTACT:

                            long id = ContentUris.parseId(uri);

                            String where = "_id=" + id;

                            if (selection != null && !"".equals(selection)) {

                                     where = where + " and " + selection;

                            }

                            result = db.delete(tableName, where, selectionArgs);

                            break;

                   default:

                            throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

                   }

                   return result;

         }

 

         @Override

         public String getType(Uri uri) {

                   switch (uriMatcher.match(uri)) {

                   case CONTACT_LIST:// 集合类型必须在前面加上vnd.android.cursor.dir/

                            return "vnd.android.cursor.dir/contactlist";

                   case CONTACT:// 非集合类型必须在前面加上vnd.android.cursor.item/

                            return "vnd.android.cursor.item/contact";

                   default:

                            throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

                   }

         }

 

         @Override

         public Uri insert(Uri uri, ContentValues values) {

                   SQLiteDatabase db = this.openHelper.getWritableDatabase();

                   long id;

                   switch (uriMatcher.match(uri)) {

                   case CONTACT_LIST:

                            // 因为后台需要生成SQL语句,当valuesnull时,必须提第二个参数。生成的SQL语句才不会出错!

                            id = db.insert(tableName, "_id", values);

                            return ContentUris.withAppendedId(uri, id);

                   case CONTACT:

                            id = db.insert(tableName, "_id", values);

                            String uriPath = uri.toString();

                            String path = uriPath.substring(0, uriPath.lastIndexOf("/")) + id;

                            return Uri.parse(path);

                   default:

                            throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

                   }

         }

 

         @Override

         public boolean onCreate() {

                   this.openHelper = new MyOpenHelper(this.getContext());

                   return true;

         }

 

         @Override

         public Cursor query(Uri uri, String[] projection, String selection,

                            String[] selectionArgs, String sortOrder) {

                   SQLiteDatabase db = this.openHelper.getWritableDatabase();

                   switch (uriMatcher.match(uri)) {

                   case CONTACT_LIST:

                            return db.query(tableName, projection, selection, selectionArgs,

                                               null, null, sortOrder);

                   case CONTACT:

                            long id = ContentUris.parseId(uri);

                            String where = "_id=" + id;

                            if (selection != null && !"".equals(selection)) {

                                     where = where + " and " + selection;

                            }

                            return db.query(tableName, projection, where, selectionArgs, null,

                                               null, sortOrder);

                   default:

                            throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

                   }

         }

 

         @Override

         public int update(Uri uri, ContentValues values, String selection,

                            String[] selectionArgs) {

                   SQLiteDatabase db = this.openHelper.getWritableDatabase();

                   int result;

                   switch (uriMatcher.match(uri)) {

                   case CONTACT_LIST:

                            result = db.update(selection, values, selection, selectionArgs);

                            break;

                   case CONTACT:

                            long id = ContentUris.parseId(uri);

                            String where = "_id=" + id;

                            if (selection != null && !"".equals(selection)) {

                                     where = where + " and " + selection;

                            }

                            result = db.update(tableName, values, where, selectionArgs);

                            break;

                   default:

                            throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

                   }

                   return result;

         }

 

}

 

 

       2.添加ContentProvider配置

<provider android:name=".provider.ContactContentProvider" android:authorities="com.changcheng.sqlite.provider.contactprovider"/>

 

       3.测试SQLite示例程序的ContentProvider

       ContentProvider即然是提供给其他应用访问本应用数据的,所以我们需要另创建一个Android应用,来测试SQLite示例程序的ContentProvider。我在此只列出query的测试方法testQuery

public void testQuery() throws Throwable {

         ContentResolver contentResolver = this.getContext()

                            .getContentResolver();

         Uri uri = Uri

                            .parse("content://com.changcheng.sqlite.provider/contact");

         Cursor cursor = contentResolver.query(uri, new String[] { "_id",

                            "name", "phone" }, null, null, "_id desc");

         while (cursor.moveToNext()) {

                   Log.i(TAG, "_id=" + cursor.getInt(0) + ",name="

                                     + cursor.getString(1) + ",phone=" + cursor.getString(2));

         }

}

分享到:
评论
2 楼 keynescao 2011-11-04  
兄弟写得不错,受教了。
1 楼 jackhao168 2010-10-22  

相关推荐

    基于Android ContentProvider的总结详解

    相关概念介绍1)ContentProvider简介当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式...

    contentprovider

    1)ContentProvider简介 当应用继承ContentProvider类 并重写该类用于提供数据和存储数据的方法 就可以向其他应用共享其数据 虽然使用其他方法也可以对外共享数据 但数据访问方式会因数据存储的方式而不同 如:采用...

    Android核心技术与实例详解 PDF扫描版

    2 2 5 ContentProvider简介 2 2 6 Intent和IntentFilter简介 2 3 小结 第3章 Android布局管理器 3 1 控件类概述 3 1 1 View类简介 3 1 2 ViewGroup类简介 3 2 线性布局 3 2 1 LinearLayout类简介 3 2 2 线性布局案例...

    联系人操作 ContentProvider ContentResolver使用

    ContentProvider使用简介里面的demo

    疯狂Android讲义源码

     9.1.1 ContentProvider简介 352  9.1.2 Uri简介 353  9.1.3 使用ContentResolver操作  数据 354  9.2 操作系统的ContentProvider 355  9.2.1 使用ContentProvider管理  联系人 355  9.2.2 使用...

    疯狂Android讲义.part2

    9.1.1 ContentProvider简介 352 9.1.2 Uri简介 353 9.1.3 使用ContentResolver操作 数据 354 9.2 操作系统的ContentProvider 355 9.2.1 使用ContentProvider管理 联系人 355 9.2.2 使用ContentProvider管理 多媒体...

    疯狂Android讲义.part1

    9.1.1 ContentProvider简介 352 9.1.2 Uri简介 353 9.1.3 使用ContentResolver操作 数据 354 9.2 操作系统的ContentProvider 355 9.2.1 使用ContentProvider管理 联系人 355 9.2.2 使用ContentProvider管理 多媒体...

    Android入门到精通源代码.

    1.2 Android简介 1.2.1 Andriod的历史 1.2.2 Andriod的未来 1.2.3 Andriod平台的技术架构 1.3 Android应用程序构成 1.3.1 活动(Activity) 1.3.2 意图(Intent) 1.3.3 服务(Service) 1.3.4 内容提供器...

    Android 4大组件简介.pdf

    Android系统中有4大组件: Activity、Service、Broadcast、ContentProvider. 一个Android应用程序(Apk)中可以包含一个或多个组件. 从开发者的角度来说, 当我们想做一个Apk时, 一般会弄一个文件夹, 在文件夹下面会...

    疯狂Android讲义源代码2

    1.1.1 Android的发展和简介 1.1.2 Android平台架构及特性 1.2 搭建Android开发环境 1.2.1 下载和安装Android SDK 1.2.2 安装Eclipse和ADT插件 1.3 Android常用开发工具的用法 1.3.1 创建、删除和浏览AVD ...

    Kotlin语法实战与Android应用笔记.docx

    Kotlin语法实战与Android应用笔记:...5、全面地罗列了Android系统的常用组件:Activity、Service、BraodcastReceiver和ContentProvider,各Wedget的成员属性和方法,包括AlertDialog的几种用法,List的Adapter构造等。

    Android基础教程

    内容简介  《Android基础教程(第3版·修订版)》是一部关于Android开发的基础教程,采用Pragmatic系列图书一贯由浅入深、循序渐进的方式讲解了Android程序设计的核心概念和技术。书中不仅结合数独游戏开发案例形象...

    Android开发应用实战详解源代码

    第1章 androi简介 1.1 初识android 1.1.1 历史背景 1.1.2 android特性 1.1.3 android组件结构 1.1.4 android应用程序框架 1.1.5 android的竞争优势 1.1.6 android模拟器 1.2 搭建android开发环境 1.2.1 准备工作 ...

    android移动平台软件设计

    主要包括Android简介、Android开发环境的搭建、Activity技术、Android用户界面布局、Android Intent、Android广播机制、Android Service、Android数据存储、Android ContentProvider以及Android网络编程技术。

    Android基础知识详解

    ContentProvider、ContentResolver 6.5 105 Intent 106 用Intent启动Activity,并在Activity之间传递数据 106 调用其他应用程序中的Activity(打电话、浏览网页、发Email等) 109 接收和发送广播 113 接收系统广播 113...

    Android应用开发详解

    内容简介 本书分为三个部分,包括基础篇、技术篇和应用篇。由浅入深地讲述了Android应用开发的方方面面。 第一篇 基础篇 第1章 Android概述 Android概述,讲述了Android的前生后世、架构和特点、Android Market...

    pandaman:android app 地址设置工具

    简介 android app 服务器地址设置工具apk(android)主要功能:在开发环境中修改,新增,切换 连接的服务器的地址。 该工具简单易用,从而告别之前客户端切换服务端地址的繁琐操作,新工具切换服务器地址只需点击...

Global site tag (gtag.js) - Google Analytics