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
- android数据对外共享的方式----contentProvider
- 十、android的ContentProvider对外共享数据
- ContentProvider 对外共享数据
- Android 使用ContentProvider对外共享数据与监听ContentProvider数据的变化
- 使用android中ContentProvider组件对外共享以及监听ContentProvider中数据的变化
- 使用ContentProvider对外共享数据
- Android开发入门之采用ContentProvider对外共享数据
- Android的四大组件之ContentProvider(对外程序共享数据)
- Android 对外共享数据
- 实例教程九:采用ContentProvider对外共享数据
- Android 面试题笔记-------ContentProvider实现数据共享的方式
- Android之使用Contentprovider对外共享数据和实现数据监听变化
- android Contextprovider 对外共享数据
- 采用ContentProvider对外共享数据,ContentResolver获取数据
- Android -----数据共享ContentProvider
- Android共享数据ContentProvider的使用
- android 编写content_provider对外共享数据
- android 编写content_provider对外共享数据
- Android TextView内容过长加省略号,点击显示全部内容
- 【Android进阶】如何使用文件来保存程序中的数据
- google推出的SwipeRefreshLayout下拉刷新用法
- 简单版QQ聊天
- 环境变量
- android数据对外共享的方式----contentProvider
- 电感磁芯公式
- OpenCV2马拉松第25圈——直线拟合与RANSAC算法
- mysql 启动错误集锦
- 情殇
- DEMO阶段已经完成,现在应该往深里钻了
- KMP算法的工作流程介绍
- no copy constructor available or copy constructor is declared 'explicit'
- linux下如何用GDB调试c++程序