android开发学习-内容共享(server+client)

在应用之间共享数据

通过ContentProvider封装数据

ContentProvider使用的Uri语法结构如下:

content://authority/data_path/id

content:通用前缀,表示该uri用于ContentProvider定位资源

authority:是授权者名称,用来确定具体由哪一个ContentProvider提供资源。因此一般anthority都由类小写的全程组成,以保证唯一性。

data_path:是数据路径,用来确定请求的是哪一个数据集

id:是数据编号,用来请求单条数据。如果是多条,这个字段请忽略。

通过ContentResolver访问数据

使用内容组件获取通信信息

运行时,动态申请权限

利用ContentResolver读写联系人

利用ContentObserver监听短信

使用Servet和Client进行通信实例

server-UserDBHelper.java

package com.example.server.database;import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;public class UserDBHelper extends SQLiteOpenHelper {public static final String DB_NAME = "user.db";public static final String TABLE_NAME = "user_info";public static final int DB_VERSION = 1;public static UserDBHelper mHelper = null;private SQLiteDatabase mRDB = null;private SQLiteDatabase mWDB = null;public static UserDBHelper getInstance(Context context) {if (mHelper == null) {mHelper = new UserDBHelper(context);}return mHelper;}public UserDBHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);}public SQLiteDatabase openReadLink() {if (mRDB == null || !mRDB.isOpen()) {mRDB = mHelper.getReadableDatabase();}return mRDB;}public SQLiteDatabase openWriteLink() {if (mWDB == null || !mWDB.isOpen()) {mWDB = mHelper.getWritableDatabase();}return mWDB;}public void closeDBLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;}}//创建数据库,执行建表语句@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +"_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +"name VARCHAR NOT NULL," +"age INTEGER NOT NULL," +"height LONG NOT NULL," +"weight FLOAT NOT NULL," +"married INTEGER NOT NULL);";db.execSQL(sql);}//    public void insert(User user) {
//        ContentValues values = new ContentValues();
//        mWDB.insert(TABLE_NAME,null,values);
//    }@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

server-UserContentProvider.java

package com.example.server.provider;import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;import com.example.server.database.UserDBHelper;public class UserContentProvider extends ContentProvider {private UserDBHelper dbHelper;private static String TAG = "pansd-UserContentProvider";@Overridepublic boolean onCreate() {Log.d(TAG, "onCreate: UserContentProvider");dbHelper = UserDBHelper.getInstance(getContext());return true;}public UserContentProvider() {}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException("Not yet implemented");}// content://com.example.server.provider.UserContentProvider/user@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO: Implement this to handle requests to insert a new row.Log.d(TAG, "insert: 开始插入");SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();writableDatabase.insert(UserDBHelper.TABLE_NAME,null,values);
//        throw new UnsupportedOperationException("Not yet implemented");Log.d(TAG, "insert: 插入成功");return uri;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO: Implement this to handle query requests from clients.Log.d(TAG, "query: UserContentProvider");SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor query = db.query(UserDBHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, null);//        throw new UnsupportedOperationException("Not yet implemented");return query;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException("Not yet implemented");}
}

server-清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.server"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Demo1"><providerandroid:name=".provider.UserContentProvider"android:authorities="com.example.server.provider.usercontentprovider"android:enabled="true"android:exported="true"></provider><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

Client-avtivity

package com.example.client;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;public class ContentWriteActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_content_write);}public void contentProviderWrite(View view) {ContentValues values = new ContentValues();values.put("name", "pshdhx");values.put("age", 22);values.put("height", 183);values.put("weight", Float.parseFloat("164"));values.put("married", true);getContentResolver().insert(UserInfoContent.CONTENT_URI, values);
//        Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();System.out.println("values = " + values);}public void contentProviderQuery(View view) {Cursor query = getContentResolver().query(UserInfoContent.CONTENT_URI, null, null, null, null);int userId = 999;String name = "";if (query != null) {while (query.moveToNext()) {userId = query.getInt(query.getColumnIndex("_id"));name = query.getString(query.getColumnIndex("name"));}query.close();}Toast.makeText(this, "userId="+userId+"=name="+name, Toast.LENGTH_SHORT).show();
//        System.out.println("name = " + name);}
}

Client-清单文件

    <queries><package android:name="com.example.server"/>
<!--        <provider android:authorities="com.example.server.provider.UserContentProvider"/>--></queries>

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

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

相关文章

【Python--读获取目录下所有csv文件中的均值与偏态】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Python &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python练习题 读获取目录下所有csv文件中的均值与偏态按照均值和偏态最大值进行排序完整代码 读获取目录下…

基于OpenCV的图形分析辨认03

目录 一、前言 二、实验目的 三、实验内容 四、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&…

LeetCode.2917. 找出数组中的 K-or 值

题目 2917. 找出数组中的 K-or 值 分析 这道题其实是要我们求第i位二进制为1的元素个数至少为k&#xff0c;把符合条件的2^i全部加到一起。 因此&#xff0c;我们的思路就是枚举数组的每一位&#xff0c;并且进行以下两个步骤&#xff1a; 统计所有元素第i位1的个数cnt。…

ubuntu 中进入python 编辑如何退出到命令行

文章目录 在Python解释器&#xff08;交互式命令行&#xff09;中&#xff0c;你可以使用 exit()函数或 CtrlD&#xff08;在Unix/Linux/macOS上&#xff09;或 CtrlZ然后输入 Enter&#xff08;在Windows上&#xff09;来退出Python解释器并返回到命令行。 以下是具体的步骤&a…

SpringSecurity配置MD5加密方式

目录 一、需求 二、代码实现 2.1、MD5加密工具类 2.2、实现MD5加密

【论文阅读】DeepLab:语义图像分割与深度卷积网络,自然卷积,和完全连接的crf

【论文阅读】DeepLab:语义图像分割与深度卷积网络&#xff0c;自然卷积&#xff0c;和完全连接的crf 文章目录 【论文阅读】DeepLab:语义图像分割与深度卷积网络&#xff0c;自然卷积&#xff0c;和完全连接的crf一、介绍二、联系工作三、方法3.1 整体结构3.2 使用空间金字塔池…

弹性地基梁matlab有限元编程 | 双排桩支护结构 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

mysql bug( InnoDB: Error number 22),表突然不能读取

mysql bug&#xff08; InnoDB: Error number 22&#xff09;&#xff0c;表突然不能读取 bug最开始的bug&#xff1a;表突然不能读取关闭mysql容器&#xff0c;再次重启失败 解决方案不重建容器的几种可能措施重建容器重建如果懒得打命令或者忘记命令可能的run bug&#xff1a…

【目标检测】旋转目标检测DOTA格式转YOLO格式标注

准备DOTA格式数据集&#xff1a; dota_dataset -- images |----- train |----- val -- labels |----- train |----- train_original |----- val |----- val_original 修改class_mapping和图片格式&#xff1a; ultralytics/data/converter.py convert_dota_to_yolo_obb() 转换标…

从零学算法128

128.给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4…

打破界限,释放创新:一键将HTML转化为PDF

在互联网时代&#xff0c;HTML作为网页的标准语言&#xff0c;承载着无数的信息与创意。然而&#xff0c;有时我们需要将这些在线内容转化为可打印、可分享的PDF格式。这时&#xff0c;一款高效、便捷的转换工具就显得尤为重要。 首先&#xff0c;我们要进入首助编辑高手主页面…

API分享:淘宝拍立淘API接口|按图搜索商品列表API|电商爆品搜索API

今天来跟大家分享一个非常有用的API&#xff0c;以图搜索商品列表API&#xff1a;item_search_img。通过此API可以实现传入一个图片链接&#xff0c;来获取到该图片上的商品信息&#xff0c;商品列表&#xff0c;支持翻页展示。 item_search_img-按图搜索淘宝商品&#xff08;…

Linux内核基础 - list_move_tail函数详解

Linux Kernel list_move_tail 函数 技术背景 Linux内核使用双向链表来管理各种数据结构。这种双向链表的实现使得元素的插入和删除操作非常高效&#xff0c;特别是在需要频繁修改链表结构时。list_move_tail函数是这种双向链表操作中的一个&#xff0c;用于在链表中移动节点。…

react高阶组件:如何同时兼容class类组件和函数式组件。

场景&#xff1a; 每个页面都要实现分享功能&#xff0c;但是页面有些是用class类&#xff0c;有些又直接是函数式。 方案1&#xff1a; 写2套方法。各自引用。&#xff08;维护不太好&#xff0c;改要改2遍&#xff09; 方案2&#xff1a; 可以封一个 jsx的组件&#xff0c…

中国制造走向世界wordpress外贸建站模板主题

水泵阀门wordpress外贸网站模板 水泵、阀门、管材、管件wordpress外贸网站模板&#xff0c;适合外贸独立站的网站模板。 https://www.jianzhanpress.com/?p3748 保健器械wordpress外贸网站主题 保健、健身器械wordpress外贸网站主题&#xff0c;适合做外贸网站的wordpress模…

【QT C++实践】Qt 项目中一个界面动态处理多张数据库中的表|附源码

一、前言 在之前那篇讲如何使用QT连接数据库时&#xff08;QT C实践|超详细数据库的连接和增删改查操作|附源码)&#xff0c;做了一个简单的对数据库进行增删改查的界面(如下&#xff09;。 但是存在一个问题就是&#xff1a;这个界面只是对一张表进行操作&#xff0c;但是我…

驱动调试第014期-变频调速的原理及相关计算公式应用

一、引言 变频调速是一种通过改变电源频率来实现电动机调速的技术。它具有高效、精确、可靠等优点&#xff0c;广泛应用于工业、商业和家用领域。本文将介绍变频调速的基本原理、优点以及应用领域&#xff0c;并通过详细的公式计算过程和图片说明来帮助读者更好地理解。 二、变…

2023年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-选择题解析

2023年 中小学信息学奥赛CSP-J真题解析 1、在C中&#xff0c;下面哪个关键字用于声明一个变量&#xff0c;其值不能被修改 A、unsigned B、const C、static D、mutable 答案&#xff1a;B 考点分析&#xff1a;主要考查变量声明相关知识&#xff0c;const是声明常量&…

0基础跨考408|一战上岸复盘及经验分享

基础阶段‼️ 王道的四本书的选择题部分要都做完、订正完。 王道的四门视频课要一轮刷完&#xff08;或者题主在B站看了其他的老师&#xff0c;这其实也是算一轮的&#xff0c;只要题主是认真学习了的&#xff0c;题主说自己不知道看什么课&#xff0c;王道就好了&#xff09;…

解决SpringBoot集成WebSocket打包失败问题

前言 这几天在一个SpringBoot项目中使用WebSocket来用作客服聊天以及上传文件功能,项目在写的时候,以及在idea中跑的时候都非常完美,结果一打成jar包是,报错.在网上查了报错原因,原来是自己导入的WebSocket的jar与SpringBoot内置tomcat中的WebSocket的jar冲突,需要在打包时把S…