provider android简书,Android 使用ContentProvider在应用间共享数据
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在应用间共享数据相关推荐
- provider android简书,Android 7.0 provider属性说明
2018-07-18 生命不息,奋斗不止,万事起于忽微,量变引起质变 -------- Hongyang 1.注册一个provider android:name="android.suppo ...
- provider android简书,android FileProvider的使用
对于面向Android 7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开file://URI.如果一项包含文件URI的intent离开您的应用,则应用出现故 ...
- 简书Android APP上线了
在历经了几个月的奋战之后简书Android客户端终于和大家见面了,下载链接轻戳这里,当然您也能在国内各大应用商店下载的到.(记得好评哦-) 先上张图给大家感受一下吧 Android APP截图(左为启 ...
- 给简书找BUG赢好礼17.06.02——简书Android 2.4.0 公测【私密文章支持预览/手机支持直接提现】...
你给简书找bug,简书给你送好礼.即日起,参与简书公测就有机会获得简书提供的精美周边!公测版下载>>公测版下载备用地址>> 本期公测版本-简书Android 2.4.0: 更新 ...
- 简书Android客户端更新日志1504010-离线下载
时间悄悄溜进了四月,这是一个草长莺飞.万物复苏的季节,小动物们都忙着繁衍下一代,简书君却还苦逼的坐在办公室里感叹岁月这把杀猪的刀.说到四月不得不提的就是欢乐的愚人节,本次愚人节简书君也和大家开了一个小 ...
- Android不同APP间共享数据:sharedUserId
Android-sharedUserId数据权限 Android给每个APK进程分配一个单独的用户空间,其manifest中的userid就是对应一个Linux用户 (Android 系统是基于Lin ...
- 高仿简书Android,高仿简书个人中心页面
高仿简书个人中心页面 Demo下载地址: 先贴上效果图 1. 步骤 1.1 把APP的主题改为NoAction 1.2 引入Material Design 包 implementation 'com. ...
- android自动登录简书,Android开发之简单登录界面
用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...
- android 读写文件 简书,Android 中的文件操作
Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...
最新文章
- Lucene 学习笔记(一)
- 总被忽略的 2 条产品原则
- Java匿名内部类总结
- 我终于拿到CMU的offer了!
- Kotlin by属性委托
- 廖雪峰mysql安装教程 pdf_使用MySQL - 廖雪峰 Python 3 教程
- 周末项目:使用scikit-learn进行手语和静态手势识别
- Android源码-Logger日志系统
- Android 开发者的 RxJava 详解(一)
- 设计模式之单例模式介绍
- Js数组排序函数sort()介绍
- 283.移动零 (力扣leetcode) 博主可答疑该问题
- 亲身经历,大龄程序员,为什么难找对象!
- WPS使用格式刷复制样式之后重新排序
- php退款,PHP实现微信申请退款流程的方法
- 荣耀4a android art,荣耀4A拆机图解·看真相
- 速卖通韩国下载量再次登顶,7500万投资换来回报
- 为什么很多人工作都不开心?(转)
- 程序员兼职接私活平台大全,兼职也能月薪上万
- c++ enum 给定类型_讲解C++中的枚举类型以及声明新类型的方法