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. JS-日期框、下拉框、全选复选框

    <!-- 下拉框 --><link rel="stylesheet" href="static/ace/css/chosen.css" /&g ...

  2. ubuntu 14.04安装postgresql最新版本

    官网:https://www.postgresql.org/download/linux/ubuntu/ ----------------------------------------------- ...

  3. C++函数后面的throw()

    看CImage函数实现的时候发现了这么个东东  inline HBITMAP CImage::Detach() throw() 它是函数提供者和使用者的一种君子协定,标明该函数不抛出任何异常. 之所以 ...

  4. T-shirts Distribution

    T-shirts Distribution time limit per test 1 second memory limit per test 256 megabytes input standar ...

  5. Swift 与 JSON 数据 浅析

    转载自:http://www.cnblogs.com/theswiftworld/p/4660177.html 我们大家平时在开发 App 的时候,相信接触最多的就是 JSON 数据了.只要你的 Ap ...

  6. filter by date in Sphinx

    Indexing: include the date column in the sql_query of source. Also set the date as sql_attr_unit PHP ...

  7. EF在单例模式及C/S方式开发时,操作数据对象以后如果发生异常,要做善后工作。

    try{ 删除或修改 }catch { _DBContext.Refresh(RefreshMode.StoreWins, entity); }

  8. Android MediaScanner 详尽分析

    [Innost]: http://blog.csdn.net/Innost/article/details/6083467 ====================================== ...

  9. access restriction

    一.既然存在访问规则,那么修改访问规则即可.打开项目的Build Path Configuration页面,打开报错的JAR包,选中Access rules条目,选择右侧的编辑按钮,添加一个访问规则即 ...

  10. 单线驱动74hc595(转)

    源:http://blog.chinaunix.net/uid-10701701-id-91938.html 这个电路是国外一个哥们2009年的时候发表的. http://www.romanblack ...