前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >android数据对外共享的方式----contentProvider

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

作者头像
用户4148957
发布于 2022-06-14 00:27:20
发布于 2022-06-14 00:27:20
73200
代码可运行
举报
文章被收录于专栏:C/C++与音视频C/C++与音视频
运行总次数:0
代码可运行

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

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

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 对外进行数据共享,必需在清单文件中注册,以下是注册过程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?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程序的数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">新建另外一个B应用程序,测试用例如下:</span>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content://域名/路径/记录/字段
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content://com.example.databaseService.contactsProvider/contacts    表示访问contacts所有的记录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content://com.example.databaseService.contactsProvider/contacts/10  表示访问contacts中ID10的记录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content://com.example.databaseService.contactsProvider/contacts/10/name  表示访问contacts中ID10的name字段
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android组件系列—-ContentProvider内容提供商【5】
2、执行query()方法,查询全部记录(眼下一共两条记录)。后台输出效果例如以下:
全栈程序员站长
2022/07/06
2950
Android组件系列—-ContentProvider内容提供商【5】
Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/09/13
4290
Content Provider 之 最终弹   实战体验跨程序数据共享(结合SQLiteDemo)
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
在Android中有些数据(如通讯录、音频、视频文件等)是要供非常多应用程序使用的。为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据。比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能)。
全栈程序员站长
2022/07/07
7670
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
Android 四大组件学习之ContentProvider二
上节学习了什么是ContentProvider,以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider
DragonKingZhu
2022/05/08
1640
Android 四大组件学习之ContentProvider二
Android中ContentProvider简介
翻看Android源码可以发现,Android一般的代码架构如下:activity,service,receiver----contentProvider------db(file) 也就是说创建数据库保存数据,借助contentprovider对数据进行增删该查,上层利用Android组件进行交互。于是想着给自己新写的项目也添加个contentProvider来学习Android谷歌工程师的高大上,但从未用过contentprovider,这是第一次用,用完之后就发现一个问题 第一,contentprov
fanfan
2018/01/24
7310
Android四大组件之ContentProvider
Android四大组件之ContentProvider ContentProvider 安卓应用程序默认是无法获取到其他程序的数据,这是安卓安全学的基石(沙盒原理)。但是经常我们需要给其他应用
xiangzhihong
2018/01/26
1K0
ContentProvider初探
其实很多时候我们用到ContentProvider并不是自己暴露自己的数据,更多的时候通过 ContentResolver来读取其他应用的信息,最常用的莫过于读取系统APP,信息,联系人, 多媒体信息等!如果你想来调用这些ContentProvider就需要自行查阅相关的API资料了! 另外,不同的版本,可能对应着不同的URL!这里给出如何获取URL与对应的数据库表的字段, 这里以最常用的联系人为例,其他自行google~
小小工匠
2021/08/16
5510
Android 进阶11:进程通信之 ContentProvider 内容提供者
学习启舰大神,每篇文章写一句励志的话,与大家共勉。 When you are content to be simply yourself and don’t compare or compete,
张拭心 shixinzhang
2018/01/05
2.7K0
Android 进阶11:进程通信之 ContentProvider 内容提供者
《移动互联网技术》 第七章 数据存取: 掌握File、SharePreferences、SQLite和ContentProvider四种数据存取方式
《移动互联网技术》课程是软件工程、电子信息等专业的专业课,主要介绍移动互联网系统及应用开发技术。课程内容主要包括移动互联网概述、无线网络技术、无线定位技术、Android应用开发和移动应用项目实践等五个部分。移动互联网概述主要介绍移动互联网的概况和发展,以及移动计算的特点。无线网络技术部分主要介绍移动通信网络(包括2G/3G/4G/5G技术)、无线传感器网络、Ad hoc网络、各种移动通信协议,以及移动IP技术。无线定位技术部分主要介绍无线定位的基本原理、定位方法、定位业务、数据采集等相关技术。Android应用开发部分主要介绍移动应用的开发环境、应用开发框架和各种功能组件以及常用的开发工具。移动应用项目实践部分主要介绍移动应用开发过程、移动应用客户端开发、以及应用开发实例。 课程的教学培养目标如下: 1.培养学生综合运用多门课程知识以解决工程领域问题的能力,能够理解各种移动通信方法,完成移动定位算法的设计。 2.培养学生移动应用编程能力,能够编写Andorid应用的主要功能模块,并掌握移动应用的开发流程。 3. 培养工程实践能力和创新能力。  通过本课程的学习应达到以下目的: 1.掌握移动互联网的基本概念和原理; 2.掌握移动应用系统的设计原则; 3.掌握Android应用软件的基本编程方法; 4.能正确使用常用的移动应用开发工具和测试工具。
猫头虎
2024/04/08
1230
Android点将台:济世儒侠[-ContentProvider-]
张风捷特烈
2024/02/09
2290
Android点将台:济世儒侠[-ContentProvider-]
Android ContentProvider实例详解
ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。  Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到ContentProvider。而且Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
Android技术干货分享
2019/05/07
2.4K0
Android ContentProvider实例详解
Android-ContentProvider使用
一 建立ContentProviderserver端 1 建立一个继承自ContentProvider的类并重写接口方法(这里仅打一些log做代表)
全栈程序员站长
2022/07/11
3160
Android必知必会的四大组件--ContentProvider
作为四大组件之一,它的地位绝对不容许轻视的。但是我们在哪里有用到过他呢?其实很多场景都有,比如说你在使用app时,是不是经常的会询问你是否开启通讯录的访问,如果你同意了,这个时候ContentProvider就发挥了他的作用。
ClericYi
2020/06/23
5450
Android四大组件之ContentProvider
Hi,大家好,我们又双叒叕见面啦,为了让大家快速的学习Android知识,我们每天都在更新文章,相信小伙伴们已经开始眼熟我们了!这一期我们讲解ContentProvider(内容提供者)相关知识,他也是我们近期更新的Android四大组件中最后一个。话不多说,让我们赶紧开始学习吧~
下码看花
2019/09/02
6590
Android四大组件之ContentProvider
Android 第三次作业 contentprovider与resolver
1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;
张浪
2022/11/24
4500
Android 四大组件学习之ContentProvider四
上节我们学习了如何去读取系统短信以及插入一条短信到系统中。 本节我们学习如何获取系统的联系人,以及插入一条联系人
DragonKingZhu
2022/05/08
2320
Android 四大组件学习之ContentProvider四
Android:关于ContentProvider的知识都在这里了!
4.2.2 MIME类型组成 每种MIME类型 由2部分组成 = 类型 + 子类型
Carson.Ho
2019/02/22
2.5K0
安卓开发_深入理解Content Provider
一、Content Provider概述 Content Provider用于保存和获取数据,并使其对所有应用程序可见,这是不同应用程序之间共享数据的唯一方式,因为在Android中没有提供所有应用可以共同访问的公共存储区域 1、  Content Provider内部的数据如何保存是由其设计者决定的,而所有的的Content Provider都实现一组通用的方法,用来提供数据的增删改查操作 2、  客户端如果要使用这些操作方法,可以通过ContentProvider对象实现对 Content Provid
听着music睡
2018/05/18
7300
Android基础总结(6)——内容提供器
  前面学习的数据持久化技术包括文件存储、SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问。虽然文件存储和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种操作模式,可以实现不同应用程序间的数据共享,但是这两种模式在Android4.2版本中就已经被废弃了。目前,Android系统推荐使用一种更加安全可靠的内容提供器技术。 内容提供器(Content Provider)主要用于在不
mukekeheart
2018/02/27
1.2K0
Android进程间通信(五):进程间通信的方式之ContentProvider
前面我们介绍了: 进程间通信基础介绍 通过AIDL介绍Binder的工作机制 通过 Bundle、文件共享、Messenger实现进程间通信 进程间通信的方式之AIDL
103style
2022/12/19
6440
推荐阅读
相关推荐
Android组件系列—-ContentProvider内容提供商【5】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验