Content Provider 小结

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

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

主配置文件

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

 1 package com.example.android_contentprovider;
 2
 3 import android.net.Uri;
 4
 5 public class Tools {
 6
 7     public static final int VERSION = 1;// 数据库版本号
 8     public static final String DNAME = "student.db";// 数据库名称
 9     public static final String TABLE_NAME = "student";// 表名
10     public static final String ID="id";
11     public static final String PEOPLE_NAME="name";
12     public static final String ADDRESS="address";
13     public static final String SEX="sex";
14     public static final int     STUDENT=1;
15     public static final int STUDENTS=2;
16     public static final String AUTHORITY="com.example.android_contentprovider.StudentProvider";
17     public static final String  ONLY="vnd.android.cursor.item/"+TABLE_NAME;
18     public static final String  MULITY= "vnd.android.cursor.dir/"+TABLE_NAME;
19     public static final String URL="content://"+AUTHORITY+"/"+TABLE_NAME;
20 }

Tools.java

创建名为student的数据库

 1 package com.example.android_contentprovider;
 2
 3 import android.content.Context;
 4 import android.database.DatabaseErrorHandler;
 5 import android.database.sqlite.SQLiteDatabase;
 6 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 7 import android.database.sqlite.SQLiteOpenHelper;
 8
 9 public class DbHelper extends SQLiteOpenHelper {
10
11     public DbHelper(Context context) {
12         super(context, Tools.DNAME, null, Tools.VERSION);
13         // TODO Auto-generated constructor stub
14     }
15
16     // 创建一个数据库
17
18     @Override
19     public void onCreate(SQLiteDatabase db) {
20         // TODO Auto-generated method stub
21         String sql = "create table " + Tools.TABLE_NAME + " ( " + Tools.ID
22                 + " integer primary key autoincrement ," + Tools.PEOPLE_NAME
23                 + " varchar(64)," + Tools.ADDRESS + " varchar(64))";
24         db.execSQL(sql);
25     }
26
27     @Override
28     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
29         // TODO Auto-generated method stub
30
31     }
32
33 }

DbHelper.java

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

  1 package com.example.android_contentprovider;
  2
  3 import android.R.integer;
  4 import android.R.string;
  5 import android.content.ContentProvider;
  6 import android.content.ContentUris;
  7 import android.content.ContentValues;
  8 import android.content.UriMatcher;
  9 import android.database.Cursor;
 10 import android.database.CursorJoiner.Result;
 11 import android.database.sqlite.SQLiteDatabase;
 12 import android.net.Uri;
 13 import android.provider.ContactsContract.Contacts.Data;
 14 import android.provider.SyncStateContract.Helpers;
 15 import android.util.Log;
 16
 17 public class StudentProvider extends ContentProvider {
 18     // 实例化
 19     private DbHelper helper = null;
 20     public static final UriMatcher pUriMatcher = new UriMatcher(
 21             UriMatcher.NO_MATCH);
 22     static {
 23         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME + "/#",
 24                 Tools.STUDENT);
 25         pUriMatcher.addURI(Tools.AUTHORITY, Tools.TABLE_NAME, Tools.STUDENTS);
 26     }
 27
 28     @Override
 29     public boolean onCreate() {
 30         // TODO Auto-generated method stub
 31         helper = new DbHelper(getContext());
 32         return false;
 33     }
 34 //进行查找操作
 35     @Override
 36     public Cursor query(Uri uri, String[] projection, String selection,
 37             String[] selectionArgs, String sortOrder) {
 38         // TODO Auto-generated method stub
 39         Cursor cursor = null;
 40         try {
 41             SQLiteDatabase database = helper.getWritableDatabase();
 42             int flag = pUriMatcher.match(uri);
 43             switch (flag) {
 44             case Tools.STUDENT:
 45                 long id = ContentUris.parseId(uri);
 46                 String where_values = " id = " + id;
 47
 48                 if (selection != null && !selection.equals("")) {
 49                     where_values += " and " + selection;
 50                 }
 51                 cursor = database.query(Tools.TABLE_NAME, null, where_values,
 52                         selectionArgs, null, null, null);
 53                 break;
 54             case Tools.STUDENTS:
 55                 cursor = database.query(Tools.TABLE_NAME, null, selection,
 56                         selectionArgs, null, null, null);
 57                 break;
 58             }
 59         } catch (Exception e) {
 60             // TODO: handle exception
 61         }
 62         return cursor;
 63     }
 64
 65     @Override
 66     public String getType(Uri uri) {
 67         // 得到匹配符
 68         int flag = pUriMatcher.match(uri);
 69         switch (flag) {
 70         case Tools.STUDENT:
 71             return Tools.ONLY;
 72         case Tools.STUDENTS:
 73             return Tools.MULITY;
 74         default:
 75             throw new IllegalArgumentException("Unknown URI" + uri);
 76         }
 77     }
 78
 79     // 进行插入操作
 80     @Override
 81     public Uri insert(Uri uri, ContentValues values) {
 82         // TODO Auto-generated method stub
 83         Uri resultUri = null;
 84         int flag = pUriMatcher.match(uri);
 85         switch (flag) {
 86         case Tools.STUDENTS:
 87             SQLiteDatabase database = null;
 88             database = helper.getWritableDatabase();
 89             // id表示插入当前行的行号
 90             long id = database.insert(Tools.TABLE_NAME, null, values);
 91             resultUri = ContentUris.withAppendedId(uri, id);
 92             getContext().getContentResolver().notifyChange(resultUri, null);
 93             break;
 94
 95         }
 96         Log.i("StudentProvider", resultUri.toString());
 97         return resultUri;
 98     }
 99
100     // 进行删除操作
101     @Override
102     public int delete(Uri uri, String selection, String[] selectionArgs) {
103         // TODO Auto-generated method stub
104         int resultId = -1;
105         try {
106             SQLiteDatabase database = helper.getWritableDatabase();
107             int flag = pUriMatcher.match(uri);
108             switch (flag) {
109             case Tools.STUDENT:
110                 long id = ContentUris.parseId(uri);
111                 String where_values = "id= " + resultId;
112                 if (selection != null && !selection.equals("")) {
113                     where_values += " and " + selection;
114                 }
115                 resultId = database.delete(Tools.TABLE_NAME, where_values,
116                         selectionArgs);
117
118                 break;
119             case Tools.STUDENTS:
120                 resultId = database.delete(Tools.TABLE_NAME, selection,
121                         selectionArgs);
122                 break;
123             }
124         } catch (Exception e) {
125             // TODO: handle exception
126         }
127
128         return resultId;
129     }
130 //进行修改更新
131     @Override
132     public int update(Uri uri, ContentValues values, String selection,
133             String[] selectionArgs) {
134         // TODO Auto-generated method stub
135         int resultId = -1;
136         try {
137             // update table set name=?,address=? where id=?
138             long id = ContentUris.parseId(uri);
139             int flag = pUriMatcher.match(uri);
140             SQLiteDatabase database = helper.getWritableDatabase();
141             switch (flag) {
142             case Tools.STUDENT:
143                 String where_values = " id = " + id;
144                 if (selection != null && !selection.equals("")) {
145                     where_values += " and " + selection;
146                 }
147                 resultId = database.update(Tools.TABLE_NAME, values,
148                         where_values, selectionArgs);
149                 break;
150             }
151         } catch (Exception e) {
152             // TODO: handle exception
153         }
154         return resultId;
155     }
156
157 }

StudentProvider.java

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

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

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

</instrumentation>

定义MyTest测试类继承AndroidTestCase

 1 package com.example.android_contentprovider;
 2
 3 import android.content.ContentResolver;
 4 import android.content.ContentValues;
 5 import android.database.Cursor;
 6 import android.net.Uri;
 7 import android.test.AndroidTestCase;
 8
 9 public class MyTest extends AndroidTestCase {
10
11     public MyTest() {
12         // TODO Auto-generated constructor stub
13     }
14
15     public void insert() {
16         ContentResolver contentResolver = getContext().getContentResolver();
17         Uri url = Uri.parse(Tools.URL);
18         ContentValues values = new ContentValues();
19         values.put(Tools.PEOPLE_NAME, "王五");
20         values.put(Tools.ADDRESS, "北京");
21         contentResolver.insert(url, values);
22     }
23
24     public void delete() {
25         ContentResolver contentResolver = getContext().getContentResolver();
26         Uri uri = Uri.parse(Tools.URL + "/1");
27         contentResolver.delete(uri, null, null);
28     }
29
30     public void update() {
31         ContentResolver contentResolver = getContext().getContentResolver();
32         Uri uri = Uri.parse(Tools.URL + "/2");
33         ContentValues values = new ContentValues();
34         values.put(Tools.PEOPLE_NAME, "程洋");
35         values.put(Tools.ADDRESS, "上海");
36         contentResolver.update(uri, values, null, null);
37
38     }
39
40     public void query() {
41         ContentResolver contentResolver = getContext().getContentResolver();
42         Uri uri = Uri.parse(Tools.URL);
43         Cursor cursor = contentResolver.query(uri, null, null, null, null);
44         while (cursor.moveToNext()) {
45             // 输出查询该条记录的名字
46             System.out
47                     .println("你所查找的学生为:"
48                             + cursor.getString(cursor
49                                     .getColumnIndex(Tools.PEOPLE_NAME))
50                             + ";地址为:"
51                             + cursor.getString(cursor
52                                     .getColumnIndex(Tools.ADDRESS)));
53         }
54     }
55 }

MyTest.java

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

时间: 2024-10-20 11:46:33

Content Provider 小结的相关文章

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

文件存储和SharePreference存储以及数据存储一般为了安全,最好用于当前应用程序中访问和存储数据.内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性.目前使用内容提供器是android实现跨程序共享数据的标准方式.内容提供器可以选择只对一部分数据进行共享,从而保证我们的程序中的隐私数据不会有泄漏的风险. 内容提供器的用法一般有两种,一种是使用现有的内容提

Android development Notes-3(Activity, Intents, and Tasks, Service, Content provider)

Summary:Activity, Intents, and Tasks, Service, Content provider -Android introduces a richer and more complex approach by supporting multiple application entry points. Android programs should expect the system to start them in different places, depen

Android学习总结——Content Provider

原文地址:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Content Provider内容提供者 : android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序.这些数据可以存储在文件系统中.在一个SQLite数据库.或以任何其他合理的方式, 其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中

Android四大基本组件(2)之Service 服务与Content Provider内容提供者

一.Service 服务: 一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序. 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器.在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲.然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的.在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从

内容提供器(Content Provider)

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性. 目前,使用内容提供器是 Android 实现跨程序共享数据的标准方式. 内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口.

数据库和Content Provider

SQLite提供了强大的SQL数据库的库文件,从而使应用程序拥有一个具备完全控制权的健壮的持久化层. Content Provider实现在应用程序内和应用程序之间存储.共享和使用结构化数据.通过将数据存储层和应用层分离,Content Provider为各种数据源提供了一个通用的接口(用来发布数据). Android通过结合使用SQLite数据库和Content Provider,提供了结构化数据的持久化功能.每个应用程序都可以创建自己的数据库,并对真个数据库拥有完全的控制权.创建了底层数据存

android笔记 : Content provider内容提供器

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能. 内容提供器的用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们程序的数据提供外部访问接口. 第一种方法:使用ContentResolver来读取和操作相应程序中的数据 1.用parse方法将内容 URI 字符串解析成 Uri 对象. uri(Uniform Resource identifier)指的是统一资源标识符Uri uri = Uri .

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

Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Pro

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri