android数据对外共享的方式----contentProvider

来源:互联网 发布:吾知所以距子矣的距 编辑:程序博客网 时间:2024/05/01 07:14

android下一个应用程序产生的数据要供其他程序共享有以下方式:

1.文件以可读可写的方式放在SD卡或手机内

2.数据库文件放到SD卡中读写

但以上两种方式虽然也可以实现共享,但不同文件读写方法不一样,

这content provider统一了各种存储方式的方法,屏蔽了操作细节,文件或数据库将其封装成contentProvider后,读写操作方法就统一了,不需要关心其存储的差异。

这里以数据库封装中contentProvider为例进行学习。当然普通文件也一样的,对输入文件流进行封装成contentProvider即可。

以下是A程序数据库的封装(数据库的实现见Sqlite的操作)

package com.example.databaseService;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.util.Log;public class contactsProvider extends ContentProvider {private Dbservice db;private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);private static final int CONTACTS = 1;private static final int CONTACT= 2;static{MATCHER.addURI("com.example.databaseService.contactsProvider", "contacts", CONTACTS);MATCHER.addURI("com.example.databaseService.contactsProvider", "contacts/#", CONTACT);}@Overridepublic int delete(Uri uri, String arg1, String[] arg2) {SQLiteDatabase sqdb = db.getWritableDatabase();int num = 0; switch(MATCHER.match(uri)) { case  CONTACTS : num = sqdb.delete("contacts", arg1, arg2); Log.i("mytag","delelta all"); break; case CONTACT: long rowid = ContentUris.parseId(uri);String where = "contactID="+ rowid;if(arg1!=null && !"".equals(arg1.trim())){where += " and "+ arg1;} Log.i("mytag","delelta a recoder");num = sqdb.delete("contacts", where, arg2); default: Log.e("mytag","can't match the uri"); }return 0;}@Overridepublic String getType(Uri arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues Values) {// TODO Auto-generated method stub SQLiteDatabase sqdb = db.getWritableDatabase(); switch(MATCHER.match(uri)) { case  CONTACTS : long rowid = sqdb.insert("contacts", "name", Values); Uri Inserturi= Uri.parse("content://com.example.databaseService.contactsProvider/contacts"+rowid); return Inserturi; default: Log.e("mytag","can't match the uri"); }return null;}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubdb=new Dbservice(this.getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,String arg4) {SQLiteDatabase sqdb = db.getWritableDatabase(); Cursor cursor = null; switch(MATCHER.match(uri)) { case  CONTACTS : cursor = sqdb.query("contacts", arg1,arg2, arg3, null,null,arg4); break; case CONTACT: long rowid = ContentUris.parseId(uri);String where = "contactID="+ rowid;if(arg2!=null && !"".equals(arg2.trim())){where += " and "+ arg2;}cursor = sqdb.query("contacts", arg1,where, arg3, null,null,arg4);break; default: Log.e("mytag","can't match the uri"); }return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String arg2, String[] arg3) {SQLiteDatabase sqdb = db.getWritableDatabase();int num = 0; switch(MATCHER.match(uri)) { case  CONTACTS : num = sqdb.update("contacts", values, arg2, arg3); break; case CONTACT: long rowid = ContentUris.parseId(uri);String where = "contactID="+ rowid;if(arg2!=null && !"".equals(arg2.trim())){where += " and "+ arg2;}num = sqdb.update("person", values, where, arg3); default: Log.e("mytag","can't match the uri"); }return num;}}

content provider 对外进行数据共享,必需在清单文件中注册,以下是注册过程

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.database"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="19" />        <application        android:allowBackup="true"        android:icon="@drawable/testview"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <uses-library android:name="android.test.runner" />                  <activity            android:name="com.example.database.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                               <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>         <provider               android:exported="true"             android:name="com.example.databaseService.contactsProvider"              android:authorities="com.example.databaseService.contactsProvider"             />    </application><instrumentation android:name="android.test.InstrumentationTestRunner"  android:targetPackage="com.example.database" android:label="Tests for My App" /></manifest>
在Android4.2当中必需要有

 android:exported="true"

否则B程序将无法访问A程序的数据库

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">新建另外一个B应用程序,测试用例如下:</span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">package com.example.providercontent;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.test.AndroidTestCase;import android.util.Log;public class test extends AndroidTestCase {public void testInsert(){Uri uri=Uri.parse("content://com.example.databaseService.contactsProvider/contacts");Log.e("mytag", "111111");ContentResolver resolve=this.getContext().getContentResolver();Log.e("mytag", "122222");ContentValues values=new ContentValues();values.put("name", "hfl");values.put("phonenum","13265720919");values.put("amount", "24000");resolve.insert(uri, values);}public void testdelete(){Uri uri=Uri.parse("content://com.example.databaseService.contactsProvider/contacts");ContentResolver resolve=this.getContext().getContentResolver();resolve.delete(uri, "contactID=3", null);}public void testupdate(){Uri uri=Uri.parse("content://com.example.databaseService.contactsProvider/contacts");ContentResolver resolve=this.getContext().getContentResolver();ContentValues values=new ContentValues();values.put("name", "flh2");values.put("phonenum","13265720919");values.put("amount", "220000");resolve.update(uri, values, "contactID=6", null);}public void testQuery(){Uri uri=Uri.parse("content://com.example.databaseService.contactsProvider/contacts");ContentResolver resolve=this.getContext().getContentResolver();    Cursor cursor;cursor=resolve.query(uri, null, null, null, "contactID asc");while(cursor.moveToNext()){Log.i("mycuror",cursor.getString(cursor.getColumnIndex("name")));}}}
ubi格式:

content://域名/路径/记录/字段
如:
content://com.example.databaseService.contactsProvider/contacts    表示访问contacts所有的记录
content://com.example.databaseService.contactsProvider/contacts/10  表示访问contacts中ID为10的记录
content://com.example.databaseService.contactsProvider/contacts/10/name  表示访问contacts中ID为10的name字段


0 0
原创粉丝点击