contentProvider 内容提供者

http://blog.csdn.net/woshixuye/article/details/8280879

实例代码
当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver(内容解析器)传入相应的URI就可以了。
contentProvider和Activity一样是Android的组件,故使用前需要在AndroidManifest.xml中注册,必须放在主应用所在包或其子包下。

 1  <application android:icon="@drawable/icon" android:label="@string/app_name">
 2      <activity android:name=".MainActivity"
 3                android:label="@string/app_name">
 4          <intent-filter>
 5              <action android:name="android.intent.action.MAIN" />
 6              <category android:name="android.intent.category.LAUNCHER" />
 7          </intent-filter>
 8          <intent-filter>
 9              <data android:mimeType="vnd.android.cursor.dir/person" />
10          </intent-filter>
11          <intent-filter>
12              <data android:mimeType="vnd.android.cursor.item/person" />
13          </intent-filter>
14      </activity>
15      <!-- 配置内容提供者,android:authorities为该内容提供者取名作为在本应用中的唯一标识 -->
16      <provider android:name=".providers.PersonProvider"
17 android:authorities="cn.xyCompany.providers.personProvider"/>
18  </application>
19
20 内容提供者和测试代码
21  
  1 package cn.xy.cotentProvider.app.providers;
  2 import android.content.ContentProvider;
  3 import android.content.ContentUris;
  4 import android.content.ContentValues;
  5 import android.content.UriMatcher;
  6 import android.database.Cursor;
  7 import android.database.sqlite.SQLiteDatabase;
  8 import android.net.Uri;
  9 import android.util.Log;
 10 import cn.xy.cotentProvider.service.DBOpeningHelper;
 11
 12 /**
 13  * contentProvider作为一种组件必须放在应用所在包或其子包下,主要作用是对外共享数据
 14  * 测试步骤1:将本项目先部署
 15  * 测试步骤2:调用测试方法
 16  * @author xy
 17  *
 18  */
 19 public class PersonProvider extends ContentProvider
 20 {
 21     private DBOpeningHelper dbHelper;
 22
 23     // 若不匹配采用UriMatcher.NO_MATCH(-1)返回
 24     private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
 25
 26     // 匹配码
 27     private static final int CODE_NOPARAM = 1;
 28     private static final int CODE_PARAM = 2;
 29
 30     static
 31     {
 32         // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式
 33         // 匹配返回CODE_NOPARAM,不匹配返回-1
 34         MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);
 35
 36         // #表示数字 cn.xyCompany.providers.personProvider/person/10
 37         // 匹配返回CODE_PARAM,不匹配返回-1
 38         MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);
 39     }
 40
 41     @Override
 42     public boolean onCreate()
 43     {
 44         dbHelper = new DBOpeningHelper(this.getContext());
 45         return true;
 46     }
 47
 48     /**
 49      * 外部应用向本应用插入数据
 50      */
 51     @Override
 52     public Uri insert(Uri uri, ContentValues values)
 53     {
 54         SQLiteDatabase db = dbHelper.getWritableDatabase();
 55         switch (MATCHER.match(uri))
 56         {
 57             case CODE_NOPARAM:
 58                 // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列
 59                 long id = db.insert("person", "name", values);
 60                 Uri insertUri = ContentUris.withAppendedId(uri, id);
 61                 return insertUri;
 62             default:
 63                 throw new IllegalArgumentException("this is unkown uri:" + uri);
 64         }
 65     }
 66
 67     /**
 68      * 外部应用向本应用删除数据
 69      */
 70     @Override
 71     public int delete(Uri uri, String selection, String[] selectionArgs)
 72     {
 73         SQLiteDatabase db = dbHelper.getWritableDatabase();
 74         switch (MATCHER.match(uri))
 75         {
 76             case CODE_NOPARAM:
 77                 return db.delete("person", selection, selectionArgs); // 删除所有记录
 78             case CODE_PARAM:
 79                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
 80                 Log.i("provider", String.valueOf(id));
 81                 String where = "id = " + id;
 82                 if (null != selection && !"".equals(selection.trim()))
 83                 {
 84                     where += " and " + selection;
 85                 }
 86                 return db.delete("person", where, selectionArgs);
 87             default:
 88                 throw new IllegalArgumentException("this is unkown uri:" + uri);
 89         }
 90     }
 91
 92     /**
 93      * 外部应用向本应用更新数据
 94      */
 95     @Override
 96     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
 97     {
 98         SQLiteDatabase db = dbHelper.getWritableDatabase();
 99         switch (MATCHER.match(uri))
100         {
101             case CODE_NOPARAM:
102                 return db.update("person",values,selection, selectionArgs); // 更新所有记录
103             case CODE_PARAM:
104                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
105                 String where = "id = " + id;
106                 if (null != selection && !"".equals(selection.trim()))
107                 {
108                     where += " and " + selection;
109                 }
110                 return db.update("person",values,where,selectionArgs);
111             default:
112                 throw new IllegalArgumentException("this is unkown uri:" + uri);
113         }
114     }
115
116     /**
117      * 返回对应的内容类型
118      * 如果返回集合的内容类型,必须以vnd.android.cursor.dir开头
119      * 如果是单个元素,必须以vnd.android.cursor.item开头
120      */
121     @Override
122     public String getType(Uri uri)
123     {
124         switch(MATCHER.match(uri))
125         {
126             case CODE_NOPARAM:
127                 return "vnd.android.cursor.dir/person";
128             case CODE_PARAM:
129                 return "vnd.android.cursor.item/person";
130             default:
131                 throw new IllegalArgumentException("this is unkown uri:" + uri);
132         }
133     }
134
135     @Override
136     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
137     {
138         SQLiteDatabase db = dbHelper.getReadableDatabase();
139         switch (MATCHER.match(uri))
140         {
141             case CODE_NOPARAM:
142                 return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
143             case CODE_PARAM:
144                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字
145                 String where = "id = " + id;
146                 if (null != selection && !"".equals(selection.trim()))
147                 {
148                     where += " and " + selection;
149                 }
150                 return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
151             default:
152                 throw new IllegalArgumentException("this is unkown uri:" + uri);
153         }
154     }
155
156 }
157
158
159
160 测试代码
161 package cn.xy.test.test;
162 import android.content.ContentResolver;
163 import android.content.ContentValues;
164 import android.database.Cursor;
165 import android.net.Uri;
166 import android.test.AndroidTestCase;
167 import android.util.Log;
168
169 /**
170  * 测试代码
171  * @author xy
172  *
173  */
174 public class TestProviders extends AndroidTestCase
175 {
176     // 在执行该测试方法时需要先将还有内容提供者的项目部署到Android中,否则无法找到内容提供者
177     public void testInsert()
178     {
179         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
180         ContentResolver resolver = this.getContext().getContentResolver();
181         ContentValues values = new ContentValues();
182         values.put("name", "xy");
183         values.put("phone", "111");
184         resolver.insert(uri, values); // 内部调用内容提供者的insert方法
185     }
186
187     // 不带id参数的删除
188     public void testDelete1()
189     {
190         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");
191         ContentResolver resolver = this.getContext().getContentResolver();
192         int rowAffect = resolver.delete(uri, null, null);
193         Log.i("rowAffect", String.valueOf(rowAffect));
194     }
195
196     // 带参数的删除,通过URI传递了id至contentProvider并可追加其他条件
197     public void testDelete2()
198     {
199         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/18");
200         ContentResolver resolver = this.getContext().getContentResolver();
201         int rowAffect = resolver.delete(uri, "name = ?", new String[] { "XY2" }); // 在provider中手动进行了拼装
202         Log.i("rowAffect", String.valueOf(rowAffect));
203     }
204
205     public void testUpdate()
206     {
207         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19");
208         ContentResolver resolver = this.getContext().getContentResolver();
209         ContentValues values = new ContentValues();
210         values.put("name", "newxy");
211         values.put("phone", "new111");
212         int rowAffect = resolver.update(uri, values, null, null);
213         Log.i("rowAffect", String.valueOf(rowAffect));
214     }
215
216     public void testQuery()
217     {
218         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19");
219         ContentResolver resolver = this.getContext().getContentResolver();
220         Cursor cursor = resolver.query(uri, new String[]{"id","name","phone"}, null, null, "id asc");
221         if(cursor.moveToFirst())
222         {
223             Log.i("query", cursor.getString(cursor.getColumnIndex("name")));
224         }
225         cursor.close();
226     }
227 }  
时间: 2024-10-11 18:07:28

contentProvider 内容提供者的相关文章

android 53 ContentProvider内容提供者

ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标准的方法而且不用知道音频文件在那个文件夹里面,只要设置条件就可以找到. 安卓系统把音视频.图片存在系统内部的数据库里面,ContentProvider操作的是数据库不是去文件夹里面去找.sd卡和内存卡的文件安卓系统都会登记,登记文件类型.路径,文件名,文件大小都保存在数据库里.ContentProv

android contentprovider内容提供者

contentprovider内容提供者:让其他app可以访问私有数据库(文件) 1.AndroidManifest.xml 配置provider <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.dbtest&q

Android组件系列----ContentProvider内容提供者

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4108017.html 联系方式:[email protected] [正文] 一.ContentProvider简介: ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider可以理解为一个Android应用对外开放的

入门篇:9.组件4:ContentProvider(内容提供者)

android 四大基本组件 的ContentProvider(内容提供者) 这个组件其实就是一个应用进行数据或数据库提供.共享其他应用获取数据的组件,其大致的结构图如下: 其中uri是一个重要的中间媒介. 联系到我们平时用的安卓程序,最常见的就是通讯录.在我们的安卓手机里,通讯录的设计其实是两个程序,其中有一个程序没有用户界面,单纯的存储着联系人信息,并且数据库结构复杂,这也是为了保证数据的安全.另外一个程序就是我们可以看见的通讯录程序.那么第一个程序就是一个ContentProvider,用

Android组件系列----ContentProvider内容提供者【4】

(4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentResolver来操作ContentProvider所暴露处理的接口.一般使用Content.getContentResolver()方法获取ContentResolver对象.第一段中已经提到:ContentProvider有非常多对外能够訪问的方法,在ContentResolver中均有同名的方法

(转)ContentProvider 内容提供者

1.1.  什么是内容提供者 内容提供者是Android中的四大组件之一,可以将应用中的数据对外进行共享 内容提供者将数据的访问方式统一,不必针对不同数据类型采取不同的访问策略 内容提供者将数据封装,只暴露出我们希望提供给其他程序的数据 内容提供者中数据更改可被监听 1.2.  创建内容提供者 定义类继承ContentProvider,根据需要重写内部方法    在清单文件的<application>节点下进行配置,<provider>标签中需要指定name和authorities

(8)Launcher3客制化之ContentProvider内容提供者,实现其他应用修改数据库更新等操作

首先添加两个权限 <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS"/> <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS"/> 这两个是修改 桌面的数据库的权限 不添加就修改不了哦 直接通过内容提供者获取数据, static Ar

Android组件系列----ContentProvider内容提供者【2】

二.代码举例: 终于全部project文件的文件夹结构例如以下: PersonDao是增删改查数据库的工具类,并在PersonContentProvider中得到调用.DBHelper用于初始化SQLite数据库. PersonContentProvider用于向外提供增删改查的接口.并终于在ContentResolverTest的Test.java中进行单元測试,实现CRUD. 以下来看一下详细的实现步骤. 新建project文件ContetProviderTest01. (1)新建类Pers

【Android基础】内容提供者ContentProvider的使用详解

1.什么是ContentProvider 首先,ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用的比较少. ContentProvider为不同的软件之间数据共享,提供统一的接口.也就是说,如果我们想让其他的应用使用我们自己程序内的数据,就可以使用ContentProvider定义一个对外开放的接口,从而使得其他的应用可以使用咱们应用的文件.数据库内存储的信息.当然,自己开发的应用需要给其他应用共享信息的需求可能比较少见,但是在Andro