Android 使用ContentProvider在应用间共享数据

题图 www.gratisography.com

在开发的过程中,有时会有需求要实现应用程序之间实现数据共享,在Android系统中提供了一个内容提供者ContentProvider

可以实现这个功能,需要继承这个类,并实现相关的接口,其他的应用就可以通过uri来访问相关的数据,在Android中最常见的

内容提供者就是MediaProvider,所有的应用都可以通过uri来访问系统中的媒体数据,我们也可以实现这样的功能,首先就是要

确定你的应用是否要向外提供数据

设计数据存储

我们这里是通过数据库最为媒介来提供数据,需要设计具体的数据库的数据结构,通过系统提供的SQLiteOpenHelper类来创建数据库

核心的代码:

简单的数据结构,根据自己的需求设计数据库的数据结构

public final class Settings implements BaseColumns{

private Settings(){}

public static final String TABLE_NAME = "settings"; //数据库中标的名称

public static final String COLUMN_NAME_TITLE = "name"; //表中的列名

public static final String COLUMN_NAME_VALUE = "value"; //表中的列名

}

继承SQLiteOpenHelper来创建数据库

private static class DatabaseHelper extends SQLiteOpenHelper{

public DatabaseHelper(Context context) {

super(context, DB_NAME, null, DB_VERSION);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS settings");

onCreate(db);

}

@Override

public void onCreate(SQLiteDatabase db) {

String sql = " CREATE TABLE "+Settings.TABLE_NAME +" ("

+ Settings._ID +" INTEGER PRIMARY KEY,"

+ Settings.COLUMN_NAME_TITLE +" TEXT,"

+ Settings.COLUMN_NAME_VALUE +" TEXT"

+ ");";

db.execSQL(sql);

}

}

内容提供者

ContentProvider需重载的接口如下:

public Uri insert(Uri uri, ContentValues values)

public int delete(Uri uri, String selection, String[] selectionArgs)

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

public String getType(Uri uri)

URI的设计

[content://][com.example.demo.gank.provider][/settings][/1]

|-----A-----|---------------B---------------|-----C----|--D-|

A:是Scheme,固定为content://

B: 是Authority,用来识别特定的Content Provider,一般使用应用的报名来命名

C:是资源的路径

D: 资源的ID

为了传入的uri执行不同的操作,可以通过Android中的UriMatcher实体类,将uri映射不同的内容

设置权限

可以为provider设置权限

package="com.example.demo.gank">

。。。。

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true"

android:theme="@style/AppTheme">

android:authorities="com.example.demo.gank.provider"

android:name="com.example.demo.gank.provider.SettingsProvider"

android:readPermission="com.example.demo.gank.provider.READ_PROVIDER"

android:writePermission="com.example.demo.gank.provider.WRITE_PROVIDER"

android:exported="true">

运行工程,这个工程应用是A,A应用安装之后,这个应用就是一个内容提供者

再建一个工程B,在B中访问数据,这个是工程B中访问数据库的代码

Uri uri = Uri.parse("content://com.example.demo.gank.provider/settings"); //和A中提供的uri保持一致

Cursor c = getContentResolver().query(uri,new String[]{"name","value"}," name =? ", //是在A中定义的数据库的字段

new String[]{"settings"},null);

if(c != null && c.moveToFirst()){

String value = c.getString(c.getColumnIndex("value"));

log.e(TAG,"=================query value: "+value);

}

在B中的AndroidManifest.xml'中加入相关的权限

运行结果就是得到A中数据库的内容

代码

核心的逻辑代码,具体的代码请参考源码 工程源码

Settings.java

public static final String SCHEME = "content://";

private static final String PATH_SETTINGS = "/settings";

private static final String PATH_SETTINGS_ID = "/settings/";

public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.com.example.demo.gank.settings";

public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.com.example.demo.gank.settings";

SettingsProvider.java

public class SettingsProvider extends ContentProvider{

private static final String DB_NAME = "settings.db";

private static final int DB_VERSION = 1;

private static final int SETTINGS = 1;

private static final int SETTINGS_ID = 2;

//....

static {

sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

sUriMatcher.addURI(Settings.AUTHORITY,"settings",SETTINGS);

sUriMatcher.addURI(Settings.AUTHORITY,"settings/#",SETTINGS_ID);

sProjectionMap = new HashMap<>();

sProjectionMap.put(Settings.COLUMN_NAME_TITLE,Settings.COLUMN_NAME_TITLE);

sProjectionMap.put(Settings.COLUMN_NAME_VALUE,Settings.COLUMN_NAME_VALUE);

sProjectionMap.put(Settings._ID,Settings._ID);

}

@Nullable

@Override

public Uri insert(Uri uri, ContentValues values) {

return null;

}

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

return 0;

}

@Override

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {

return 0;

}

@Nullable

@Override

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {

return null;

}

@Nullable

@Override

public String getType(Uri uri) {

return null;

}

@Override

public boolean onCreate() {

mOPenHelper = new DatabaseHelper(getContext());

return true;

}

private static class DatabaseHelper extends SQLiteOpenHelper{

//具体的代码请参看源码

//。。。。

}

}

provider android简书,Android 使用ContentProvider在应用间共享数据相关推荐

  1. provider android简书,Android 7.0 provider属性说明

    2018-07-18 生命不息,奋斗不止,万事起于忽微,量变引起质变 -------- Hongyang 1.注册一个provider android:name="android.suppo ...

  2. provider android简书,android FileProvider的使用

    对于面向Android 7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开file://URI.如果一项包含文件URI的intent离开您的应用,则应用出现故 ...

  3. 简书Android APP上线了

    在历经了几个月的奋战之后简书Android客户端终于和大家见面了,下载链接轻戳这里,当然您也能在国内各大应用商店下载的到.(记得好评哦-) 先上张图给大家感受一下吧 Android APP截图(左为启 ...

  4. 给简书找BUG赢好礼17.06.02——简书Android 2.4.0 公测【私密文章支持预览/手机支持直接提现】...

    你给简书找bug,简书给你送好礼.即日起,参与简书公测就有机会获得简书提供的精美周边!公测版下载>>公测版下载备用地址>> 本期公测版本-简书Android 2.4.0: 更新 ...

  5. 简书Android客户端更新日志1504010-离线下载

    时间悄悄溜进了四月,这是一个草长莺飞.万物复苏的季节,小动物们都忙着繁衍下一代,简书君却还苦逼的坐在办公室里感叹岁月这把杀猪的刀.说到四月不得不提的就是欢乐的愚人节,本次愚人节简书君也和大家开了一个小 ...

  6. Android不同APP间共享数据:sharedUserId

    Android-sharedUserId数据权限 Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户 (Android 系统是基于Lin ...

  7. 高仿简书Android,高仿简书个人中心页面

    高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...

  8. android自动登录简书,Android开发之简单登录界面

    用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...

  9. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

最新文章

  1. Lucene 学习笔记(一)
  2. 总被忽略的 2 条产品原则
  3. Java匿名内部类总结
  4. 我终于拿到CMU的offer了!
  5. Kotlin by属性委托
  6. 廖雪峰mysql安装教程 pdf_使用MySQL - 廖雪峰 Python 3 教程
  7. 周末项目:使用scikit-learn进行手语和静态手势识别
  8. Android源码-Logger日志系统
  9. Android 开发者的 RxJava 详解(一)
  10. 设计模式之单例模式介绍
  11. Js数组排序函数sort()介绍
  12. 283.移动零 (力扣leetcode) 博主可答疑该问题
  13. 亲身经历,大龄程序员,为什么难找对象!
  14. WPS使用格式刷复制样式之后重新排序
  15. php退款,PHP实现微信申请退款流程的方法
  16. 荣耀4a android art,荣耀4A拆机图解·看真相
  17. 速卖通韩国下载量再次登顶,7500万投资换来回报
  18. 为什么很多人工作都不开心?(转)
  19. 程序员兼职接私活平台大全,兼职也能月薪上万
  20. c++ enum 给定类型_讲解C++中的枚举类型以及声明新类型的方法

热门文章

  1. 忘掉Java并发,先听完这个故事...
  2. 忠于职守 —— sysmon 线程到底做了什么?(九)
  3. ​边缘计算架构如何融合视频编码与存储
  4. Nginx 最全操作总结
  5. java spring-webflux netty
  6. 介绍一下Druild,并从Twitter大数据团队分析如何应用 Druid 分析 ZB 级实时数据?
  7. java基础---IO转换流
  8. 牛客网_PAT乙级_1015反转链表 (25)【没做出来】
  9. 如何使用markdown编辑器?官方文档在此
  10. java中final的意义