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);
}
@Override
public 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;
}
@Override
public String getType(Uri arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public 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;
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
db=new Dbservice(this.getContext());
return false;
}
@Override
public 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;
}
@Override
public 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字段
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有