ContentProvider简介

MuJoCo 关节角速度记录与可视化,监控机械臂运动状态 1. 手动计算关节速度,其中timestep为仿真步长。2. 使用data.qvel直接取得关节速度。 阅读详情

一、ContentProvider简介

当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。

二、Uri类简介

Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:


1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。

2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

3.路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

· 要操作contact表中id为10的记录,可以构建这样的路径:/contact/10

· 要操作contact表中id为10的记录的name字段, contact/10/name

· 要操作contact表中的所有记录,可以构建这样的路径:/contact

要操作的数据不一定来自数据库,也可以是文件等他存储方式,如下:

要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

三、UriMatcher、ContentUrist和ContentResolver简介

因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher:用于匹配Uri,它的用法如下:

1.首先把你需要匹配Uri路径全部给注册上,如下:

//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码

//如果match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2

uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:

· withAppendedId(uri, id)用于为路径加上ID部分

· parseId(uri)方法用于从路径中获取ID部分

ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。

四、ContentProvider示例程序

我们为昨天的SQLite示例程序添加一个ContentProvider,供其他应用来访问我们的数据。

1.为SQLite示例程序添加ContentProvider类

package com.changcheng.sqlite.provider;

import com.changcheng.sqlite.MyOpenHelper;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.net.Uri;

public class ContactContentProvider extends ContentProvider {

// 通过UriMatcher匹配外部请求

private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// 通过openHelper进行数据库读写

private MyOpenHelper openHelper;

// 匹配状态常量

private static final int CONTACT_LIST = 1;

private static final int CONTACT = 2;

// 表名

private static final String tableName = "contacts";

// 添加Uri

static {

uriMatcher.addURI("com.changcheng.sqlite.provider", "contact",

CONTACT_LIST);

uriMatcher.addURI("com.changcheng.sqlite.provider", "contact/#",

CONTACT);

}

@Override

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

SQLiteDatabase db = this.openHelper.getWritableDatabase();

int result;

switch (uriMatcher.match(uri)) {

case CONTACT_LIST:

result = db.delete(tableName, selection, selectionArgs);

break;

case CONTACT:

long id = ContentUris.parseId(uri);

String where = "_id=" + id;

if (selection != null && !"".equals(selection)) {

where = where + " and " + selection;

}

result = db.delete(tableName, where, selectionArgs);

break;

default:

throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

}

return result;

}

@Override

public String getType(Uri uri) {

switch (uriMatcher.match(uri)) {

case CONTACT_LIST:// 集合类型必须在前面加上vnd.android.cursor.dir/

return "vnd.android.cursor.dir/contactlist";

case CONTACT:// 非集合类型必须在前面加上vnd.android.cursor.item/

return "vnd.android.cursor.item/contact";

default:

throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

}

}

@Override

public Uri insert(Uri uri, ContentValues values) {

SQLiteDatabase db = this.openHelper.getWritableDatabase();

long id;

switch (uriMatcher.match(uri)) {

case CONTACT_LIST:

// 因为后台需要生成SQL语句,当values为null时,必须提第二个参数。生成的SQL语句才不会出错!

id = db.insert(tableName, "_id", values);

return ContentUris.withAppendedId(uri, id);

case CONTACT:

id = db.insert(tableName, "_id", values);

String uriPath = uri.toString();

String path = uriPath.substring(0, uriPath.lastIndexOf("/")) + id;

return Uri.parse(path);

default:

throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

}

}

@Override

public boolean onCreate() {

this.openHelper = new MyOpenHelper(this.getContext());

return true;

}

@Override

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

String[] selectionArgs, String sortOrder) {

SQLiteDatabase db = this.openHelper.getWritableDatabase();

switch (uriMatcher.match(uri)) {

case CONTACT_LIST:

return db.query(tableName, projection, selection, selectionArgs,

null, null, sortOrder);

case CONTACT:

long id = ContentUris.parseId(uri);

String where = "_id=" + id;

if (selection != null && !"".equals(selection)) {

where = where + " and " + selection;

}

return db.query(tableName, projection, where, selectionArgs, null,

null, sortOrder);

default:

throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

}

}

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

SQLiteDatabase db = this.openHelper.getWritableDatabase();

int result;

switch (uriMatcher.match(uri)) {

case CONTACT_LIST:

result = db.update(selection, values, selection, selectionArgs);

break;

case CONTACT:

long id = ContentUris.parseId(uri);

String where = "_id=" + id;

if (selection != null && !"".equals(selection)) {

where = where + " and " + selection;

}

result = db.update(tableName, values, where, selectionArgs);

break;

default:

throw new IllegalArgumentException("Uri IllegalArgument:" + uri);

}

return result;

}

}

2.添加ContentProvider配置

<provider android:name=".provider.ContactContentProvider" android:authorities="com.changcheng.sqlite.provider.contactprovider"/>

3.测试SQLite示例程序的ContentProvider

ContentProvider即然是提供给其他应用访问本应用数据的,所以我们需要另创建一个Android应用,来测试SQLite示例程序的ContentProvider。我在此只列出query的测试方法testQuery:

public void testQuery() throws Throwable {

ContentResolver contentResolver = this.getContext()

.getContentResolver();

Uri uri = Uri

.parse("content://com.changcheng.sqlite.provider/contact");

Cursor cursor = contentResolver.query(uri, new String[] { "_id",

"name", "phone" }, null, null, "_id desc");

while (cursor.moveToNext()) {

Log.i(TAG, "_id=" + cursor.getInt(0) + ",name="

+ cursor.getString(1) + ",phone=" + cursor.getString(2));

}

}

Qi标准无线充学习笔记 负载调制主要通过接收端向后散射调制计数使得功率信号改变,两者通过线圈的电压和电流的变化量来传输信号。下面是要求稳定电流的变化量不得超出8ma,判断稳定的时间至少要在150us稳定电压的变化量不得超出110mv,判断稳定的时间至少要在150us高低电流变化量至少需要15mA,判断稳定的时间至少要在100us,主线圈电流采样的时间是在半桥转换的1/4周期刻测量的高低电压变化量至少需要200mV,判断稳定的时间至少要在100us。 阅读详情

相关推荐

Android-ContentProvider数据库操作

在实际的开发过程中,Android提供了5种方式存储数据:    1.文件存储数据     2.使用 Sharedpreferences 存储数据     3.SQLite数据库存储数据     4.使用ContentProvider存储数据     5.网络存储数据 首先我们先简单了解下文件、SharedPreferred如何进行数据存储 1.文件存储操作    

u011202334的专栏 1310

避坑指南:GROMACS模拟中.tpr、.xtc、.edr、.cpt文件你用对了吗?从生成到分析全流程解析

本文详细解析GROMACS分子动力学模拟中.tpr、.xtc、.edr、.cpt等核心文件的使用技巧,从文件生成到轨迹优化、能量分析的全流程避坑指南。重点介绍拓扑文件校验、轨迹格式选择、周期性边界处理等实战经验,帮助科研人员高效管理模拟数据并准确提取关键能量信息。

weixin_30631587的博客 118

Android数据存储-ContentProvider总结

使用ContentProvider存储数据 1   简介 ContentProvider是android数据存储实现方式之一,它向应用程序之间的数据共享提供了一种机制,它会把数据以表格数据组织的方式对外提供。它具有以下特性: 1)、ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。 2

我是一只小菜鸟,飞丫飞丫飞~~~ 1915

正弦波产生电路_文氏桥振荡

本文以文氏桥振荡为基础产生正弦波,介绍了原理、计算、应用时需要注意的一些点,并给出了实测可用的电路模板

白鹤忘机的博客 3万+

BRAM在图像处理缓存中的实现:完整示例解析

深入讲解如何利用BRAM高效实现图像处理中的数据缓存,结合实际案例解析BRAM的应用优势与设计细节,提升系统性能。

weixin_29443363的博客 333

Android(四)数据存储之四ContentProvider

早上我们简要的对SQLite进行回顾,然后将SQLite的事务管理和SQLiteDataBase提供的Insert、Update、Delete、Query方法进行了简单的讲解。 今日的重点内容是ContentProvider(内容提供者)和网络存储,我将对这两大内容进行总结。关于SQLiteDataBase提供的便捷方法,它们会在ContentProvider被使用。SQLite的事务管理比较

观千剑而后识器,操千曲而后晓声。 2288

Claude Code与Codex深度对比:终端AI编程助手选型指南

大语言模型驱动的AI编程助手已成为开发者提效的重要工具,它们基于自然语言交互,自动完成代码生成、重构和调试。这类工具依赖上下文理解与工程实践,不同产品在交互模式、模型接入和任务执行上差异显著。从终端CLI编程场景出发,梳理AI编程助手的设计原理与技术价值,重点对比Anthropic Claude Code与OpenAI Codex在安装配置、上下文管理、第三方模型接入(如DeepSeek)以及高频报错处理上的实际表现。无论你是新手还是资深工程师,理解这些差异有助于根据自身工作流选择合适工具,或在两者间灵活切

weixin_33755649的博客 3216

Android | DataStrorage 与 ContentProvider

数据持久化与ContentProvider

JifengZ9的博客 982

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1180

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏1(附项目源码)

关于使用TileMap生成随机2D地图,其实之前已经有做过类似的,感兴趣可以看看 但是随着学习深入,发现之前做的比较粗糙和不够全面,最近又在外网看到

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2215

android之存储篇_ContentProvider存储

ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。其步骤为:   1. 在当前应用程序中定义一个ContentProvider。   2. 在当前应用程序的AndroidMani...

haierboos 224

语言模型推理能力与计算表达力深度解析

语言模型的推理能力本质上是一种知识迁移与泛化应用的过程,其核心在于Transformer架构中的自注意力机制和前馈网络的协同作用。计算表达力作为衡量模型能力的关键指标,涉及函数逼近、组合泛化和上下文理解等多个维度。随着模型规模的扩大,涌现能力现象揭示了参数规模与推理能力之间的非线性关系。在实际应用中,通过提示工程和微调策略可以有效激活和优化模型的推理表现。当前研究正探索模块化架构和世界模型整合等方向,以突破长程推理和因果关系建模等前沿挑战。本文深入探讨了语言模型推理泛化的技术原理与实践方法,为理解计算表达力

weixin_42521032的博客 343

Android ContentProvider简介

1. 前言 ContentProvider为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。 2. 读取通讯录 常通过ContentProvider来读取通讯录的信息。 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, n...

假装你是大灰狼的专栏 1233

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android中ContentProvider简介

翻看Android源码可以发现,Android一般的代码架构如下:activity,service,receiver----contentProvider------db(file) 也就是说创建数据库保存数据,借助contentprovider对数据进行增删该查,上层利用Android组件进行交互。于是想着给自己新写的项目也添加个contentProvider来学习Android谷歌工程师的高

fanfan 1222

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

64.ContentProvider简介

ContentProvider 是 Android 应用中的一个组件,用于在应用之间共享数据。它提供了一种一致的方式来访问和操作存储在应用中的数据。ContentProvider 使用统一资源标识符(URI)来标识数据,并使用 URI 来执行增删改查操作。

2303_79132118的博客 717

ContentProvider使用简介

原文出处:http://www.ccbu.cc/index.php/android/android-contentprovider.html ContentProvider中文名“内容提供者”,是Android系统不同应用程序之间进行数据交换的标准API,ContentProvide以Uri的形式对外提供数据,允许其他应用访问和修改数据;其他应用使用ContentResolve根据Uri进行访问操作指定的数据。Android内置的许多数据也都是使用ContentProvider形式,供开发者调用的;如视频,

^_虫虫_^的专栏 514

ContentProvider 简介

ContentProvider是不同应用程序之间交换数据的标准API, ContenProvider以某种uri的形式向外提供数据,允许其他应用访问或修改数据;、 其他程序通过ContentResolve根据Uri去访问操作指定的数据 使用时需要在manifest。xml中配置一下 <provider android:name=".DictProvider"    and...

diechan9340的博客 173
上一篇: 自定义ContentProvide
下一篇: Android音乐播放器的播放进度条(转)
Jymot
博客等级 码龄14年 6粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值