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. cssText笔记

    style.cssText 用来获取/设置元素的样式 设置: <div id= "a" style= "background: red;"> doc ...

  2. KVO 进阶

    Key-value coding (KVC) 和 key-value observing (KVO) 是两种能让我们驾驭 Objective-C 动态特性并简化代码的机制.在这篇文章里,我们将接触一些 ...

  3. 用python计算md5,sha1,crc32

    Linux下计算md5sum,sha1sum,crc: 命令 输出 $md5sum hello f19dd746bc6ab0f0155808c388be8ff0  hello $sha1sum hel ...

  4. Android多线程下安全访问数据库

    http://zhiwei.neatooo.com/blog/detail?blog=5343818a9d4869f0310000de github 原文https://github.com/dmyt ...

  5. circularprogressbar/smoothprogressbar开源视图使用学习

    github地址:https://github.com/castorflex/SmoothProgressBar 多彩圆形进度条和多彩水平进度条 colors.xml 定义变化的颜色内容,用gplus ...

  6. 改MAC地址

    Google TMAC v6. Or click here

  7. logstash安装配置

    vim /usr/local/logstash/etc/hello_search.conf 输入下面: input { stdin { type => "human" }} ...

  8. shell判断文件是否存在,不存在则创建

    if [ ! -d "/myfolder" ]; then mkdir /myfolder fi 注意[]中的空格,否则会报错

  9. WiresShark 一站式学习

    按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...

  10. emulator shortcut

    Alt+Enter Maximizes the emulator. Ctrl+F11 Changes the orientation of the emulator from landscape to ...