Android ContentProvider实现两个程序间数据共享demo,跨进程通讯

1、客户端代码:

先实现服务端

SQL创建:

public class DBHelper extends SQLiteOpenHelper {// 数据库名private static final String DATABASE_NAME = "finch.db";// 表名public static final String USER_TABLE_NAME = "user";public static final String JOB_TABLE_NAME = "job";private static final int DATABASE_VERSION = 1;//数据库版本号public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {// 创建两个表格:用户表 和职业表db.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " name TEXT)");db.execSQL("CREATE TABLE IF NOT EXISTS " + JOB_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " job TEXT)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)   {}
}
ContentProvider类代码:

 

public class MyProvider extends ContentProvider {private Context mContext;DBHelper mDbHelper = null;SQLiteDatabase db = null;public static final String AUTOHORITY = "scut.carson_ho.myprovider";// 设置ContentProvider的唯一标识public static final int User_Code = 1;public static final int Job_Code = 2;// UriMatcher类使用:在ContentProvider 中注册URIprivate static final UriMatcher mMatcher;static{mMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 初始化mMatcher.addURI(AUTOHORITY,"user", User_Code);mMatcher.addURI(AUTOHORITY, "job", Job_Code);// 若URI资源路径 = content://cn.scu.myprovider/user ,则返回注册码User_Code// 若URI资源路径 = content://cn.scu.myprovider/job ,则返回注册码Job_Code}// 以下是ContentProvider的6个方法/*** 初始化ContentProvider*/@Overridepublic boolean onCreate() {mContext = getContext();// 在ContentProvider创建时对数据库进行初始化// 运行在主线程,故不能做耗时操作,此处仅作展示mDbHelper = new DBHelper(getContext());db = mDbHelper.getWritableDatabase();// 初始化两个表的数据(先清空两个表,再各加入一个记录)db.execSQL("delete from user");db.execSQL("insert into user values(1,'Carson');");db.execSQL("insert into user values(2,'Kobe');");db.execSQL("delete from job");db.execSQL("insert into job values(1,'Android');");db.execSQL("insert into job values(2,'iOS');");return true;}/*** 添加数据*/@Overridepublic Uri insert(Uri uri, ContentValues values) {// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名// 该方法在最下面String table = getTableName(uri);// 向该表添加数据db.insert(table, null, values);// 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)mContext.getContentResolver().notifyChange(uri, null);//        // 通过ContentUris类从URL中获取ID
//        long personid = ContentUris.parseId(uri);
//        System.out.println(personid);return uri;}/*** 查询数据*/@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名// 该方法在最下面String table = getTableName(uri);//        // 通过ContentUris类从URL中获取ID
//        long personid = ContentUris.parseId(uri);
//        System.out.println(personid);// 查询数据return db.query(table,projection,selection,selectionArgs,null,null,sortOrder,null);}/*** 更新数据*/@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// 由于不展示,此处不作展开return 0;}/*** 删除数据*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// 由于不展示,此处不作展开return 0;}@Overridepublic String getType(Uri uri) {// 由于不展示,此处不作展开return null;}/*** 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名*/private String getTableName(Uri uri){String tableName = null;switch (mMatcher.match(uri)) {case User_Code:tableName = DBHelper.USER_TABLE_NAME;break;case Job_Code:tableName = DBHelper.JOB_TABLE_NAME;break;}return tableName;}}

服务端源码:https://download.csdn.net/download/meixi_android/10698025

 

 

 

客户端通过uri链接到服务端:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 对user表进行操作*/// 设置URIUri uri_user = Uri.parse("content://scut.carson_ho.myprovider/user");
//        Uri uri_user = Uri.parse("content://cn.scu.myprovider/user");// 插入表中数据ContentValues values = new ContentValues();values.put("_id", 4);values.put("name", "Jordan");// 获取ContentResolverContentResolver resolver =  getContentResolver();// 通过ContentResolver 根据URI 向ContentProvider中插入数据resolver.insert(uri_user,values);// 通过ContentResolver 向ContentProvider中查询数据Cursor cursor = resolver.query(uri_user, new String[]{"_id","name"}, null, null, null);while (cursor.moveToNext()){System.out.println("query11111 book:" + cursor.getInt(0) +" "+ cursor.getString(1));// 将表中数据全部输出}cursor.close();// 关闭游标/*** 对job表进行操作*/// 和上述类似,只是URI需要更改,从而匹配不同的URI CODE,从而找到不同的数据资源Uri uri_job = Uri.parse("content://scut.carson_ho.myprovider/job");
//        Uri uri_job = Uri.parse("content://cn.scu.myprovider/job");// 插入表中数据ContentValues values2 = new ContentValues();values2.put("_id", 4);values2.put("job", "NBA Player");// 获取ContentResolverContentResolver resolver2 =  getContentResolver();// 通过ContentResolver 根据URI 向ContentProvider中插入数据resolver2.insert(uri_job,values2);// 通过ContentResolver 向ContentProvider中查询数据Cursor cursor2 = resolver2.query(uri_job, new String[]{"_id","job"}, null, null, null);while (cursor2.moveToNext()){System.out.println("query11111 job:" + cursor2.getInt(0) +" "+ cursor2.getString(1));// 将表中数据全部输出}cursor2.close();// 关闭游标}
}

客户端源码:https://download.csdn.net/download/meixi_android/10698034

BroadcastReceiver实现跨进程通讯:https://blog.csdn.net/meixi_android/article/details/83615930

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/415112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作179:接口对接

/*创建我的视频接口 第一个参数自己手动录入 第二个参数取值任务详情的接口接口*/// postActionXing("/internal/users/current/video-projects",{// brand_id:this.account.brand_id,name:this.project_name// }).then(// res>{// this.project_idre…

二.java下使用RabbitMQ实现hello world

上一篇文章介绍了windows环境下的安装和配置rabbitMQ,具体戳这边,一.windows环境下rabbit的的安装和配置。 现在我们可以着手编写hello world程序了,一窥RabbitMQ的效用,从rabbitmq的官网的get start进入rabbitMQ文档学习区&#…

docker镜像导入、导出

导出镜像 docker save -o centos7.tar centos 导入本地镜像 sudo docker load --input centos7.tar

工作180:前端是业务需求理解

1做一个系统之前 要明确数据的一个处理流程 才能避免做返工操作

Android SQLite数据库demo。架构组件Room

Android架构组件Room Room主要包含三个部分: Database : 持有DB和DAOEntity : 定义POJO类,即数据表结构DAO(Data Access Objects) : 定义访问数据(增删改查)的接口 Entity(tableName "table_name**") 注解POJO类&…

转录组差异表达分析工具Ballgown

Ballgown是分析转录组差异表达的R包。 软件安装: 运行R, source(“http://bioconductor.org/biocLite.R”) biocLite(“ballgown”) R会自动安装Ballgown,及相应的依赖包。 Ballgown的输入文件 StringTie使用-B参数直接生成Ballgown的输入文件…

docker centos ssh

1、创建一个容器 docker run -d -p 18022:22 -p 18000:8000 --privileged -v /Users/caowei/share:/share --name yf c17f22223248 /usr/sbin/init 2、进入容器 docker exec -it 39550a9d4610 /bin/bash 3、安装openssh和openssh-server yum install -y passwd openssh op…

Android自定义view详解,使用实例,自定义属性,贝塞尔曲线

//只会触发执行onDraw方法,只会改变绘制里面的内容,条目的绘制 invalidate(); //只会触发执行onDraw方法,但是可以在子线程中刷新 postInvalidate(); //view的布局参数改变之后刷新,比如view的宽度和高度都修改了,只能通过reques…

centos使用git安装nvm

1、文件拷贝 git clone https://github.com/creationix/nvm.git source nvm/nvm.sh 2、安装node nvm install 14.9.0 nvm use 14.9.0

前端学习(2679):安装mysql_front

mysql front安装与使用教程 2020-04-10 11:32 更新mysql front一种小巧的管理Mysql的应用工具,那么这个工具该如何安装和使用呢?一起来看看吧。 一,mysql前端下载: mysql front下载地址:点击下载 二,mysql前…

Android RecyclerView 向上偏移解决、添加自定义分割线,瀑布流,ScrollView嵌套RecyclerView滑动卡顿

向上偏移解决 android:focusableInTouchMode"true" android:focusable"true" android:fillViewport"true" 卡顿解决方法 recyclerViewwg.setHasFixedSize(true); recyclerViewwg.setNestedScrollingEnabled(false); 删除条目: l…

前端学习(2678):懂代码之表格BaseTable编辑操作

第一步:编辑操作 <template slot-scope"scope"><el-buttontype"text"icon"el-icon-edit"click"handleEdit(scope.$index, scope.row)">编辑</el-button></template> 第二步 进行编辑处理 // 编辑操作handle…

vue-cli3配置externals、jquery

在index.html引入 <script src"https://cdn.bootcdn.net/ajax/libs/jquery/1.10.0/jquery.js"></script>配置文件 vue.config.js 代码如下&#xff1a; module.exports {configureWebpack:{externals: {jquery : $,}}, };

QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开

版权声明&#xff1a;若无来源注明&#xff0c;Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址&#xff1a;本文标题&#xff1a;QSharedMemory共享内存实现进程间通讯(IPC)及禁止程序多开 本文地址&#xff1a;http://techieliang.com/2017/12/685/ 文章…

工作182:表格渲染

<el-table :data"tableData" style"width: 100%" border> <!-- <el-table-column label"id" prop"1" align"center"></el-table-column>--><!--渲染账号名称--><el-table-column l…

Android 集成支付宝支付,支付宝支付2.0

成功起调支付宝支付 下载支付sdk复制到libs文件夹下并add as library&#xff1a;https://docs.open.alipay.com/54/104509 1、首先申请支付宝 企业账户 链接&#xff1a;https://memberprod.alipay.com/account/reg/enterpriseIndex.htm 备注&#xff1a;企业账户是以邮箱申…

docker centos node nginx

1、docker pull centos:centos8 2、进入容器 docker run -it centos:centos8 /bin/bash 3、安装git yum install -y git 4、安装nvm git clone https://github.com/creationix/nvm.git source nvm/nvm.sh 5、修改环境变量 vi ~/.bash_profile 加入source nvm/nvm.sh 更新 sour…

Appium——api常用函数

appium常用函数介绍&#xff1a;获取页面信息&#xff1a;1、 def get_current_activity(cls, driver):获取当前页面的activity:param driver::return:return driver.current_activity2、 def get_current_pagesource(cls, driver):获取当前页面源码:param driver::return: 返回…

android 微信支付,body为中文字符,签名错误

微信支付订单生产方法&#xff1a; /*** 根据您的订单信息 生成 微信产品支付订单信息*/private String createWeChatOrder() {StringBuffer xml new StringBuffer();try {String nonceStr genNonceStr();xml.append("</xml>");List<KeyValue> package…