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. android cordova h5总结

    最近项目 替换页面  把80%页面替换成h5了. 首页h5页面可以放在android本地.增加访问速度.节省用户流量 把服务器上的  js代码 压缩成zip格式  放在asset目录.当应用安装时候 ...

  2. Json与Gson讲解

    1 json的含义: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言.易于 ...

  3. 最近关于ACM训练与算法的总结

            到了大四以后越来越意识到基础知识的重要性,很多高屋建瓴的观点与想法都是建立在坚实的基础之上的, 招式只有在强劲的内力下才能发挥最大的作用,曾经有段时间我有这样的想法:我们出去以后和其他 ...

  4. js 判断提交表单

    <SCRIPT language=javascript> function check_book() { if(document.form1.Username.value=="& ...

  5. gSoap客户端示例程序

    先给出wsdl2h和soapcpp2的生成客户端代码 wsdl2h -s -o calc.h http://www.genivia.com/calc.wsdl soapcpp2 -i -C -x -I ...

  6. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  7. BinTools 十六进制转换

    package de.rtner.misc; public class BinTools { public static final String hex = "0123456789ABCD ...

  8. 使用U盘在Mac机上装win8.1系统

    1.首先要准备一个8G的U盘,用苹果机格式化为FAT格式.注意:U盘格式化之前要对U盘里的文件备份,U盘格式化后,里边的内容会清空. 2.下载原版win8.1系统,不要下载ghost版,http:// ...

  9. mplayer最全的命令

    前段时间做过qt内嵌mplayer的一个小程序,感觉mplayer还行不过不支持打开图片感觉有点无力.话不多说上代码: QString path="d:/1.mkv"; QWidg ...

  10. linux服务器性能状态查看

    vmstat结果内容的解释 Vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu---- ...