当前位置: 首页 > news >正文

【android开发-19】android中内容提供者contentProvider用法讲解

1,内容URI
在Android系统中,Content URI是一种用于唯一标识和访问应用程序中的数据的方法。它由Android系统提供,通过Content Provider来实现数据的共享和访问。

Content URI使用特定的格式来标识数据,通常以"content://"开头,后面跟着由Content Provider定义的数据路径和标识ID。例如,联系人数据的Content URI可能如下所示:

联系人的URI:content://com.android.contacts/contacts
某个联系人的URI:content://com.android.contacts/contacts/1
其中,"com.android.contacts"是联系人的Content Provider的名称,"contacts"是数据表的名称,"1"是联系人的ID。

注意:Content URI由2个部分组成,authority和path。authority是用于对不同应用程序做区分,一般采用程序的包名方式来命名,比如com.exemple.app。path则用于同一应用程序不同的表做区分。比如/table1,/table2.

在Android中,将内容URI解析为URI对象非常简单。可以使用Uri类的静态方法parse()来解析内容URI字符串,并将其转换为Uri对象。

以下是将内容URI解析为URI对象的示例代码:

String contentUriString = "content://com.example.app/data";  
Uri uri = Uri.parse(contentUriString);

在上面的代码中,我们定义了一个内容URI字符串"content://com.example.app/data",然后使用Uri.parse()方法将其解析为Uri对象。解析后的Uri对象可以用于后续的ContentResolver操作,如查询、插入、更新等。

需要注意的是,解析后的Uri对象是不可变的,即无法对其进行修改。如果需要更改URI,可以创建一个新的Uri对象或使用Uri.Builder类来构建一个新的URI。同时,也需要注意在使用Content Provider时需要遵循相应的权限和安全机制,以确保数据的安全性和隐私性。

总之,将内容URI解析为URI对象是Android开发中常见的操作之一,它可以帮助我们更好地访问和操作应用程序中的数据

2,ContentResolver的基本用法

ContentResolver是Android中用于访问各种内容提供者(Content Provider)的接口。内容提供者是一种共享应用程序数据的机制,它允许一个应用程序访问和操作其他应用程序的数据。实现跨进程共享数据。

以下是ContentResolver的基本用法:

1,获取ContentResolver对象:

ContentResolver contentResolver = getContentResolver();

2,使用ContentResolver查询数据:

Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
* `uri`:要查询的数据的URI。  
* `projection`:要检索的列的名称。可以指定一个包含列名的数组。如果该值为null,则会返回所有列。  
* `selection`:SQL查询语句的一部分,用于指定要检索的行。通常使用“?”占位符来避免SQL注入攻击。  
* `selectionArgs`:SQL查询语句中的占位符的值。这是一个字符串数组,可以为每个占位符提供一个值。  
* `sortOrder`:用于对结果进行排序的SQL查询语句。可以指定一个字符串,例如"name ASC"。如果不指定,则结果将按默认顺序返回。

3,处理查询结果:

* 使用`moveToFirst()`方法将光标移动到结果集的第一个条目。  
* 使用`getCount()`方法获取结果集中的条目数。  
* 使用`getString(columnIndex)`、`getInt(columnIndex)`等方法获取特定列的值。

4,关闭Cursor对象:

cursor.close();

在使用完Cursor对象后,应始终关闭它以释放相关资源。

除了查询数据,ContentResolver还可以用于插入、更新和删除数据。这些操作通常使用ContentValues对象来传递数据,并使用Uri对象指定要操作的URI。例如:

插入数据:

Uri uri = contentResolver.insert(uri, contentValues);

更新数据:

int rowsUpdated = contentResolver.update(uri, contentValues, selection, selectionArgs);

删除数据:

int rowsDeleted = contentResolver.delete(uri, selection, selectionArgs);

在Android中,ContentResolver是一个接口,它提供了访问和操作内容提供者(Content Provider)中数据的方法。以下是一个使用ContentResolver的完整参考代码,其中包括查询、插入、更新和删除数据的操作:

// 获取ContentResolver对象  
ContentResolver contentResolver = getActivity().getContentResolver();  // 1. 查询数据  
// 定义URI和查询条件  
Uri uri = Uri.parse("content://com.example.app/data");  
String selection = "name = ?";  
String[] selectionArgs = new String[]{"John"};  // 查询数据  
Cursor cursor = contentResolver.query(uri, null, selection, selectionArgs, null);  // 处理查询结果  
if (cursor != null && cursor.moveToFirst()) {  String name = cursor.getString(cursor.getColumnIndex("name"));  String age = cursor.getString(cursor.getColumnIndex("age"));  // 处理查询结果...  
}  // 关闭Cursor对象  
if (cursor != null) {  cursor.close();  
}  // 2. 插入数据  
// 定义URI和插入数据  
Uri newUri = contentResolver.insert(uri, new ContentValues());  // 处理插入结果  
if (newUri != null) {  // 处理插入结果...  
}  // 3. 更新数据  
// 定义URI和更新条件以及更新数据  
Uri updateUri = Uri.parse("content://com.example.app/data/1");  
ContentValues values = new ContentValues();  
values.put("age", 31);  int rowsUpdated = contentResolver.update(updateUri, values, null, null);  // 处理更新结果  
if (rowsUpdated > 0) {  // 处理更新结果...  
}  // 4. 删除数据  
// 定义URI和删除条件  
Uri deleteUri = Uri.parse("content://com.example.app/data/1");  
int rowsDeleted = contentResolver.delete(deleteUri, null, null);  // 处理删除结果  
if (rowsDeleted > 0) {  // 处理删除结果...  
}

在上面的代码中,我们首先获取了一个ContentResolver对象,然后分别进行了查询、插入、更新和删除数据的操作。需要注意的是,在实际开发中,我们需要根据具体的应用程序和数据结构来定义相应的URI和查询条件,以及处理查询结果、插入结果、更新结果和删除结果的方法。同时,也需要注意在使用Content Provider时需要遵循相应的权限和安全机制。

3,创建内容提供器

在Android中创建内容提供器(Content Provider)的步骤如下:

1,创建一个新的类,继承自ContentProvider类。
2,在AndroidManifest.xml文件中声明内容提供器的权限,以便其他应用程序能够访问数据。
3,在AndroidManifest.xml文件中注册内容提供器,包括指定提供器的名称、权限和数据源等信息。
4,实现ContentProvider类中的抽象方法,包括onCreate()、getType()、insert()、update()、delete()和query()等。
5,在需要访问内容提供器的应用程序中,使用ContentResolver类来获取数据。
需要注意的是,内容提供器的实现需要了解Android系统的内部机制和权限管理等方面的知识,因此需要有一定的开发经验和技术水平。同时,为了确保数据的安全性和隐私性,需要对数据访问进行适当的控制和授权。

以下是一个简单的Android内容提供器的开发代码例子:

首先,创建一个新的类,继承自ContentProvider类,并实现抽象方法:

public class MyContentProvider extends ContentProvider {  private SQLiteDatabase db;  @Override  public boolean onCreate() {  db = SQLiteDatabase.openOrCreateDatabase("mydatabase.db", null);  return true;  }  @Override  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {  // 执行查询操作,返回查询结果  return db.query("mytable", projection, selection, selectionArgs, null, null, sortOrder);  }  @Override  public String getType(Uri uri) {  // 返回数据类型  return "vnd.android.cursor.dir/mydata";  }  @Override  public Uri insert(Uri uri, ContentValues values) {  // 执行插入操作,返回插入数据的URI  long rowId = db.insert("mytable", null, values);  return Uri.parse("content://com.example.app.provider/" + rowId);  }  @Override  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {  // 执行更新操作,返回更新记录的数量  return db.update("mytable", values, selection, selectionArgs);  }  @Override  public int delete(Uri uri, String selection, String[] selectionArgs) {  // 执行删除操作,返回删除记录的数量  return db.delete("mytable", selection, selectionArgs);  }  
}

然后,在AndroidManifest.xml文件中声明内容提供器的权限和注册信息:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app">  <application>  <provider android:name=".MyContentProvider" android:authorities="com.example.app.provider" />  </application>  
</manifest>

最后,在需要访问内容提供器的应用程序中,使用ContentResolver类来获取数据:

ContentResolver contentResolver = getActivity().getContentResolver();  
Cursor cursor = contentResolver.query(Uri.parse("content://com.example.app.provider/mytable"), null, null, null, null);  
if (cursor != null && cursor.moveToFirst()) {  String name = cursor.getString(cursor.getColumnIndex("name"));  String age = cursor.getString(cursor.getColumnIndex("age"));  // 处理查询结果...  
}  
cursor.close();

注意:getType方法用于获取uri对象所对应的mime类型。一个内容uri对应的MIME类型由3个部分组成:
1,必须以vnd开头。
2,如果内容uri以路径结尾,则后面接android.cursor.dir/,如果内容uri以id结尾,则后面接vendor.cursor.item/
3,最后接上vnd..
比如,对应content://com.example.app.provider/mytable这个内容uri,对应的MIME类型写成:vnd.android.cursor.dir/mydata

相关文章:

【android开发-19】android中内容提供者contentProvider用法讲解

1&#xff0c;内容URI 在Android系统中&#xff0c;Content URI是一种用于唯一标识和访问应用程序中的数据的方法。它由Android系统提供&#xff0c;通过Content Provider来实现数据的共享和访问。 Content URI使用特定的格式来标识数据&#xff0c;通常以"content://&qu…...

浅谈排序——快速排序(最常用的排序)

快速排序&#xff08;Quick Sort&#xff09;是一种常见的排序算法&#xff0c;由英国计算机科学家东尼霍尔&#xff08;Tony Hoare&#xff09;在1960年发明。这是一种分治算法&#xff0c;基本思想是通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所…...

Springboot项目实现简单的文件服务器,实现文件上传+图片及文件回显

文章目录 写在前面一、配置1、application.properties2、webMvc配置3、查看效果 二、文件上传 写在前面 平常工作中的项目&#xff0c;上传的文件一般都会传到对象存储云服务中。当接手一个小项目&#xff0c;如何自己动手搭建一个文件服务器&#xff0c;实现图片、文件的回显…...

5V低压步进电机驱动芯片GC6150,应用于摄像机,机器人 医疗器械等产品中。具有低噪声、低振动的特点

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…...

3D Web轻量引擎HOOPS Communicator如何实现对大模型的渲染支持?

除了读取轻松外&#xff0c;HOOPS Communicator对超大模型的支持效果也非常好&#xff0c;它可以支持30GB的包含70万个零件和3.5亿个三角面的Catia装配模型&#xff01; 那么它是如何来实现对大模型的支持呢&#xff1f; 我们将从以下几个方面与大家分享&#xff1a;最低帧率…...

『 Linux 』进程地址空间概念

文章目录 &#x1fad9; 前言&#x1fad9; 进程地址空间是什么&#x1fad9; 写时拷贝&#x1fad9; 可执行程序中的虚拟地址&#x1fad9; 物理地址分布方式 &#x1fad9; 前言 在c/C中存在一种内存的概念; 一般来说一个内存的空间分布包括栈区,堆区,代码段等等; 且内存是…...

PySpark大数据处理详细教程

欢迎各位数据爱好者&#xff01;今天&#xff0c;我很高兴与您分享我的最新博客&#xff0c;专注于探索 PySpark DataFrame 的强大功能。无论您是刚入门的数据分析师&#xff0c;还是寻求深入了解大数据技术的专业人士&#xff0c;这里都有丰富的知识和实用的技巧等着您。让我们…...

三(五)ts非基础类型(对象)

在ts里面定义对象的方式也有很多。 普通定义 let obj1:{} {} // obj1.name fufu 报错&#xff0c;只能定义为空对象且不能修改 // 但是可以在赋初始值的时候直接添加属性&#xff0c;这是ts在类型推断时&#xff0c;它会宽容地匹配对象的结构。 let obj2:{} {name: fufu}…...

HeartBeat监控Redis状态

目录 一、概述 二、 安装部署 三、配置 四、启动服务 五、查看数据 一、概述 使用heartbeat可以实现在kibana界面对redis服务存活状态进行观察&#xff0c;如有必要&#xff0c;也可在服务宕机后立即向相关人员发送邮件通知 二、 安装部署 参照文章&#xff1a;HeartBeat监…...

FairGuard无缝兼容小米澎湃OS、ColorOS 14 、鸿蒙4!

随着移动互联网时代的发展&#xff0c;各大手机厂商为打造生态系统、构建自身的技术壁垒&#xff0c;纷纷投身自研操作系统。 而对于一款游戏安全产品&#xff0c;在不同操作系统下&#xff0c;是否能够无缝兼容并且提供稳定的、高强度的加密保护&#xff0c;成了行业的一大痛…...

【Copilot】Edge浏览器的copilot消失了怎么办

这种原因&#xff0c;可能是因为你的ip地址的不在这个服务的允许范围内。你需要重新使用之前出现copilot的ip地址&#xff0c;然后退出edge的账号&#xff0c;重新登录一遍&#xff0c;最后重启edge&#xff0c;就能够使得copilot侧边栏重新出现了。...

C++入门【6-C++ 修饰符类型】

C 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。 修饰符是用于改变变量类型的行为的关键字&#xff0c;它更能满足各种情境的需求。 下面列出了数据类型修饰符&#xff1a; signed&#xff1a;表示变量可以存储负数。对于整型变量来说&#xff0c;signe…...

STP笔记总结

STP --- 生成树协议 STP&#xff08;Spanning Tree Protocol&#xff0c;生成树协议&#xff09;是根据 IEEE802.1D标准建立的&#xff0c;用于在局域网中消除数据链路层环路的协议。运行STP协议的设备通过彼此交互信息发现网络中的环路&#xff0c;并有选择地对某些端口进行阻…...

Qt开发 之 记一次安装 Qt5.12.12 安卓环境的失败案例

文章目录 1、安装Qt2、安卓开发的组合套件2.1、CSDN地址2.2、官网地址2.3、发现老方法不适用了 3、尝试用新方法解决3.1、先安装JDK&#xff0c;搞定JDK环境变量3.1.1、安装jdk3.1.2、确定jdk安装路径3.1.3、打开系统环境变量配置3.1.4、配置系统环境变量3.1.5、验证JDK环境变量…...

基于SpringBoot的就业信息管理系统设计与实现(源码+数据库+文档)

摘 要 在新冠肺炎疫情的影响下&#xff0c;大学生的就业问题已经变成了一个引起人们普遍重视的社会焦点问题。在这次疫情的冲击之下&#xff0c;大学生的就业市场的供求双方都受到了不同程度的影响&#xff0c;大学生的就业情况并不十分乐观。目前&#xff0c;各种招聘平台上…...

Java面试整理(四)Java IO流

我记得自己刚开始学Java的时候,都听过师兄的分享,说IO流是很重要,而且很难。 自己正式接触之后,其实IO流这块知识并不是特别难,而且随着IT的发展,IO流这块反而用得不是很多。特别是在应用开发这个层面,用得更少。 当然,可能会有朋友跳出来说“这怎么可能?你不懂Java吧…...

《安富莱嵌入式周报》第328期:自主微型机器人,火星探测器发射前失误故障分析,微软推出12周24期免费AI课程,炫酷3D LED点阵设计,MDK5.39发布

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 【实战技能】 单步运行源码分析&#xff0c;一期视频整明白FreeRTOS内核源码框架和运行…...

产品经理在项目周期中扮演的角色Axure的安装与基本使用

目录 一.项目周期流程 二.Axure是什么 三.Axure安装 3.1 一键式安装 3.2 汉化 3.3 授权登录 四.Axure的界面介绍及基本使用 4.1 菜单栏的使用 4.2 工具栏的使用 4.3 页面概要的使用及组件的使用 4.4 组件的样式设计 一.项目周期流程 在一般的项目周期中包含的工作内容有&…...

Dockerfile创建镜像介绍

1.介绍 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile&#xff0c;docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 常用选项说明 --build-arg&#xff0c;设置构建时的…...

Android 滥用 SharedPreference 导致 ANR 问题

SharedPreference 是 Android 平台提供的一种轻量级的数据存储方式&#xff0c;它用于存储应用的配置信息或者一些简单的数据。SharedPreference 基于键值对的存储&#xff0c;并且支持基本的数据类型&#xff0c;如整型、字符串、布尔值等。它的使用非常简单方便&#xff0c;适…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...