Android中的四大组件之一ContentProvider,它支持多个应用间进行存储和读取数据等操作,实现不同应用间的数据共享。

ContentProvider,解释为内容提供商。顾名思义,就是对外提供数据。其工作形式主要是ContentProvider以Uri的形式对外提供数据,允许其他应用访问或者修改数据,其他应用程序就使用ContentResolver根据ContentProvider提供的Uri去访问进行对数据的各种操作。

实现数据共享的步骤:

1,创建一个简单的数据库供ContentProvider进行操作。创建数据库方法:定义子类继承SQLiteOpenHelper,在onCreate()方法中申明SQL创建语句,用execSQL()创建。

2,定义一个子类继承ContentProvider,然后在主配置文件中对你申明的ContentProvider进行注册!必须要注册!

3,重写其中的各种方法,如getType(),insert(),delete(),update(),query()方法。,

在其子类中,我们要做的很重要的一件事就是进行Uri的配置,使其他应用可以通过ContentResolver根据其Uri进行操作。这里我们就要用到UriMatcher类,它主要有两个方法:

一个是addURI(String authority, String path, int code),它要做的就是添加Uri。authority表示其主配置文件中的注册授权,path表示要进行操作的表名,code是你自己定义的整数。

另一个是match(Uri uri),uri就是你所要操作的uri地址,它返回一个整数,就是你之前自己定义的code。

这两个方法就相当与加密和解码的功能。一个Uri就代表对特定数据的操作。

在进行解析Uri的时候,我们需要对Uri结尾处的数字(即你所要操作表的行的id),这时候就要用到ContentUris,它用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
     一个是 withAppendedId(uri, id)用于为路径加上ID部分
     另一个是parseId(uri)方法用于从路径中获取ID部分

4,通过Context的getContentResolver()方法实例化ContentResolver。根据ContentProvider所提供的Uri进行数据访问和操作。

以下是我的操作代码:

主配置文件注册ContentProvider

 <provider android:name=".StudentProvider"
          android:authorities="com.example.android_contentprovider.StudentProvider">
 </provider>

主配置文件

定义了一个Tools工具类便于操作

 package com.example.android_contentprovider;

 import android.net.Uri;

 public class Tools {

     public static final int VERSION = 1;// 数据库版本号
     public static final String DNAME = "student.db";// 数据库名称
     public static final String TABLE_NAME = "student";// 表名
     public static final String ID="id";
     public static final String PEOPLE_NAME="name";
     public static final String ADDRESS="address";
     public static final String SEX="sex";
     public static final int     STUDENT=1;
     public static final int STUDENTS=2;
     public static final String AUTHORITY="com.example.android_contentprovider.StudentProvider";
     public static final String  ONLY="vnd.android.cursor.item/"+TABLE_NAME;
     public static final String  MULITY= "vnd.android.cursor.dir/"+TABLE_NAME;
     public static final String URL="content://"+AUTHORITY+"/"+TABLE_NAME;
 }

Tools.java

创建名为student的数据库

 package com.example.android_contentprovider;

 import android.content.Context;
 import android.database.DatabaseErrorHandler;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 import android.database.sqlite.SQLiteOpenHelper;

 public class DbHelper extends SQLiteOpenHelper {

     public DbHelper(Context context) {
         super(context, Tools.DNAME, null, Tools.VERSION);
         // TODO Auto-generated constructor stub
     }

     // 创建一个数据库

     @Override
     public void onCreate(SQLiteDatabase db) {
         // TODO Auto-generated method stub
         String sql = "create table " + Tools.TABLE_NAME + " ( " + Tools.ID
                 + " integer primary key autoincrement ," + Tools.PEOPLE_NAME
                 + " varchar(64)," + Tools.ADDRESS + " varchar(64))";
         db.execSQL(sql);
     }

     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // TODO Auto-generated method stub

     }

 }

DbHelper.java

创建子类继承ContentProvider,进行配置。

 package com.example.android_contentprovider;

 import android.R.integer;
 import android.R.string;
 import android.content.ContentProvider;
 import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.UriMatcher;
 import android.database.Cursor;
 import android.database.CursorJoiner.Result;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.provider.ContactsContract.Contacts.Data;
 import android.provider.SyncStateContract.Helpers;
 import android.util.Log;

 public class StudentProvider extends ContentProvider {
     // 实例化
     private DbHelper helper = null;
     public static final UriMatcher pUriMatcher = new UriMatcher(
             UriMatcher.NO_MATCH);
     static {
         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME + "/#",
                 Tools.STUDENT);
         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME, Tools.STUDENTS);
     }

     @Override
     public boolean onCreate() {
         // TODO Auto-generated method stub
         helper = new DbHelper(getContext());
         return false;
     }
 //进行查找操作
     @Override
     public Cursor query(Uri uri, String[] projection, String selection,
             String[] selectionArgs, String sortOrder) {
         // TODO Auto-generated method stub
         Cursor cursor = null;
         try {
             SQLiteDatabase database = helper.getWritableDatabase();
             int flag = pUriMatcher.match(uri);
             switch (flag) {
             case Tools.STUDENT:
                 long id = ContentUris.parseId(uri);
                 String where_values = " id = " + id;

                 if (selection != null && !selection.equals("")) {
                     where_values += " and " + selection;
                 }
                 cursor = database.query(Tools.TABLE_NAME, null, where_values,
                         selectionArgs, null, null, null);
                 break;
             case Tools.STUDENTS:
                 cursor = database.query(Tools.TABLE_NAME, null, selection,
                         selectionArgs, null, null, null);
                 break;
             }
         } catch (Exception e) {
             // TODO: handle exception
         }
         return cursor;
     }

     @Override
     public String getType(Uri uri) {
         // 得到匹配符
         int flag = pUriMatcher.match(uri);
         switch (flag) {
         case Tools.STUDENT:
             return Tools.ONLY;
         case Tools.STUDENTS:
             return Tools.MULITY;
         default:
             throw new IllegalArgumentException("Unknown URI" + uri);
         }
     }

     // 进行插入操作
     @Override
     public Uri insert(Uri uri, ContentValues values) {
         // TODO Auto-generated method stub
         Uri resultUri = null;
         int flag = pUriMatcher.match(uri);
         switch (flag) {
         case Tools.STUDENTS:
             SQLiteDatabase database = null;
             database = helper.getWritableDatabase();
             // id表示插入当前行的行号
             long id = database.insert(Tools.TABLE_NAME, null, values);
             resultUri = ContentUris.withAppendedId(uri, id);
             getContext().getContentResolver().notifyChange(resultUri, null);
             break;

         }
         Log.i("StudentProvider", resultUri.toString());
         return resultUri;
     }

     // 进行删除操作
     @Override
     public int delete(Uri uri, String selection, String[] selectionArgs) {
         // TODO Auto-generated method stub
         int resultId = -;
         try {
             SQLiteDatabase database = helper.getWritableDatabase();
             int flag = pUriMatcher.match(uri);
             switch (flag) {
             case Tools.STUDENT:
                 long id = ContentUris.parseId(uri);
                 String where_values = "id= " + resultId;
                 if (selection != null && !selection.equals("")) {
                     where_values += " and " + selection;
                 }
                 resultId = database.delete(Tools.TABLE_NAME, where_values,
                         selectionArgs);

                 break;
             case Tools.STUDENTS:
                 resultId = database.delete(Tools.TABLE_NAME, selection,
                         selectionArgs);
                 break;
             }
         } catch (Exception e) {
             // TODO: handle exception
         }

         return resultId;
     }
 //进行修改更新
     @Override
     public int update(Uri uri, ContentValues values, String selection,
             String[] selectionArgs) {
         // TODO Auto-generated method stub
         int resultId = -;
         try {
             // update table set name=?,address=? where id=?
             long id = ContentUris.parseId(uri);
             int flag = pUriMatcher.match(uri);
             SQLiteDatabase database = helper.getWritableDatabase();
             switch (flag) {
             case Tools.STUDENT:
                 String where_values = " id = " + id;
                 if (selection != null && !selection.equals("")) {
                     where_values += " and " + selection;
                 }
                 resultId = database.update(Tools.TABLE_NAME, values,
                         where_values, selectionArgs);
                 break;
             }
         } catch (Exception e) {
             // TODO: handle exception
         }
         return resultId;
     }

 }

StudentProvider.java

这里我注册了一个instrumentation单元测试。

<instrumentation android:name="android.test.InstrumentationTestRunner"

android:targetPackage="com.example.android_contentprovider">

</instrumentation>

定义MyTest测试类继承AndroidTestCase

 package com.example.android_contentprovider;

 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.database.Cursor;
 import android.net.Uri;
 import android.test.AndroidTestCase;

 public class MyTest extends AndroidTestCase {

     public MyTest() {
         // TODO Auto-generated constructor stub
     }

     public void insert() {
         ContentResolver contentResolver = getContext().getContentResolver();
         Uri url = Uri.parse(Tools.URL);
         ContentValues values = new ContentValues();
         values.put(Tools.PEOPLE_NAME, "王五");
         values.put(Tools.ADDRESS, "北京");
         contentResolver.insert(url, values);
     }

     public void delete() {
         ContentResolver contentResolver = getContext().getContentResolver();
         Uri uri = Uri.parse(Tools.URL + "/1");
         contentResolver.delete(uri, null, null);
     }

     public void update() {
         ContentResolver contentResolver = getContext().getContentResolver();
         Uri uri = Uri.parse(Tools.URL + "/2");
         ContentValues values = new ContentValues();
         values.put(Tools.PEOPLE_NAME, "程洋");
         values.put(Tools.ADDRESS, "上海");
         contentResolver.update(uri, values, null, null);

     }

     public void query() {
         ContentResolver contentResolver = getContext().getContentResolver();
         Uri uri = Uri.parse(Tools.URL);
         Cursor cursor = contentResolver.query(uri, null, null, null, null);
         while (cursor.moveToNext()) {
             // 输出查询该条记录的名字
             System.out
                     .println("你所查找的学生为:"
                             + cursor.getString(cursor
                                     .getColumnIndex(Tools.PEOPLE_NAME))
                             + ";地址为:"
                             + cursor.getString(cursor
                                     .getColumnIndex(Tools.ADDRESS)));
         }
     }
 }

MyTest.java

note:正学习Android之中,不足的地方还有很多望见谅。

Content Provider 小结的更多相关文章

  1. android学习十二(android的Content Provider(内容提供器)的使用)

    文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中訪问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能 ...

  2. Android开发(7)数据库和Content Provider

    问题聚焦: 思想:应用程序数据的共享 对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的 Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据 下面我们 ...

  3. Android Content Provider Guides

    Android Content Provider Guides Content Providers管理对结构化数据集的访问.它们包装数据,并且提供一种定义数据安全的机制. Content provid ...

  4. Android Content Provider基础

    Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...

  5. Android 内容提供器(Content Provider)介绍

    内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前,使用内容 ...

  6. Android学习五:Content Provider 使用

    1ContentProvider相关知识1.1在安卓应用中,通过文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreference ...

  7. 1.3 Content Provider

    ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 使用方式:一个应用实现ContentProvider来提供内 ...

  8. Android应用安全之Content Provider安全

    android平台提供了Content Provider,将一个应用程序的指定数据集提供给其它应用程序.这些数据可以存储在文件系统.SQLite数据库中,或以任何其它合理的方式存储.其他应用可以通过C ...

  9. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

随机推荐

  1. Win32 SDK Combo Box

    如下图所示,显示了三种不同风格的Combo Box样式.当然,现在这样看不出第一种与第三种之间的区别,但是第二种与其他两种的区别是明显的,第二种的列表框始终是出于现实状态的. Combo Box: 一 ...

  2. C# tostring()汇总

    原文:http://www.cnblogs.com/xiaopin/archive/2010/11/05/1870103.html C 货币 2.5.ToString("C") ¥ ...

  3. 初学.net 网页打开过程

    一个网页打开的过程 1.进入控制器里的方法里  控制器的命名必须以Controll结尾前面的名字要和view层的命名一致 2.控制器完了以后 就进入view层对应的视图里 3.视图里调用model   ...

  4. IIS访问PHP文件时,弹出用户名和密码提示框的解决方法

    找了一圈,以下的方法解决了IIS访问PHP弹用户名和密码提示框问题. 解决方法:给PHP安装目录everyone读取权限 这样不知道会不会出现安全问题,请大家谨慎.

  5. PHP生成静态页面详解

    PHP生成静态页面详解 看到很多朋友在各个地方发帖问PHP生成静态文章系统的方法,以前曾做过这样一个系统,遂谈些看法,以供各位参考.好了,我们先回顾一些基本的概念. 一,PHP脚本与动态页面. PHP ...

  6. c++模板入门

    最近使用了c++模板,觉得非常强大,只是写起来需要掌握一点技巧.大部分模板都是直接把定义写在.h头文件,并且有些人还说这样做的原因是模板不支持分编译,可是以前的编译器对模板的支持不够好吧,但是现在完全 ...

  7. Java中常见的5种WEB服务器介绍

    这篇文章主要介绍了Java中常见的5种WEB服务器介绍,它们分别是Tomcat.Resin.JBoss.WebSphere.WebLogic,需要的朋友可以参考下 Web服务器是运行及发布Web应用的 ...

  8. linux系统定时重启tomcat

    #touch auto-start.sh [root@Linux opt]# echo $LANGen_US.UTF-8 #vim auto-start.sh #!/bin/sh export LAN ...

  9. sizeof和strlen

    1.char *str="0123456789"; 这个变量是存在静态区域的,是delete不了的,是内存自动分配的,可以用strlen(str)得到其长度,不能用sizeof. ...

  10. java 工作内存

    所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的.看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓 ...