Android ContentProvider的使用

【Android高级架构师系统学习文章】Android基础-ContentProvider全方位解析(系列篇4) / 设置ContentProvider的唯一标识// UriMatcher类使用:在ContentProvider 中注册URIstatic {// 初始化// 若URI资源路径 = content://cn.scu.myprovider/user ,则返回注册码User_Code// 若URI资源路径 = content://cn.scu.myprovider/job ,则返回注册码Job_Code。 阅读详情

创建数据提供者

1. 创建一个类让其继承ContentProvider,并重载6个函数

1)先定义一个类,继承ContentProvider

  Public class MyContentProvider extends ContentProvider

2)实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)

示例如下:
public class MyContentProvider extends ContentProvider {
    private SQLiteDatabase db;
    private UriMatcher uriMatcher;

    @Override
    public boolean onCreate() {
        Log.i("test","onCreate");
        DbUtil dbUtil = new DbUtil(getContext(), "Shadow.db", null, 2);
        db = dbUtil.getReadableDatabase();
        //实例化URI匹配器, 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //添加规则
        //01.查询所有
        // 如果match()方法匹配  content://com.pxd.peopleprovider/student路径,返回匹配码为1
        uriMatcher.addURI("com.pxd.peopleprovider","student",1);//添加需要匹配uri,如果匹配就会返回匹配码
        //02.查询单个
        // 如果match()方法匹配 content://com.pxd.peopleprovider/student/3路径,返回匹配码为2
        uriMatcher.addURI("com.pxd.peopleprovider","student/#",2);//#号为通配符
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //根据URI匹配器开始匹配Uri
        int code=uriMatcher.match(uri);
        switch (code) {
            case 1:
                //查询所有
                Log.i("test","query所有");
                //获取数据库中所有的数据
                return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
            case 2:
                //查询单个
                //获取# 的值
                long id= ContentUris.parseId(uri);
                Log.i("test","query单个");
                return db.rawQuery("select * from student where _id=?",new String[]{id+""});
        }
        return  null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.i("test","getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i("test","insert");
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.i("test","delete");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.i("test","update");
        return 0;
    }
}


3)在AndroidMinifest.xml中进行声明

使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ,ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名.

<provider
            android:authorities="com.pxd.peopleprovider"
            android:name="com.pxd.provider.MyContentProvider"
            android:exported="true">
        </provider>


上例中注册了一个授权者名称为com.pxd.peopleprovider的ContentProvider,其实现类为MyContentProvider。

2.声明CONTENT_URI,实现UriMatcher

1)URI介绍

Uri代表了要操作的数据,Uri主要包含了两部分信息:

1》需要操作的ContentProvider ,

2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:



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

主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作student表中id为10的记录,可以构建这样的路径:/student/3
要操作student表中id为10的记录的name字段,student/3/name
要操作student表中的所有记录,可以构建这样的路径:/student
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中student节点下的name节点,可以构建这样的路径:/student/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://com.pxd.peopleprovider/student")

2)关于UriMatcher类使用介绍

因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher和ContentUris 。掌握它们的使用,会便于我们的开发工作。
UriMatcher类用于匹配Uri,它的用法如下:
首先第一步把你需要匹配Uri路径全部给注册上,如下:

示例:
  //实例化URI匹配器, 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //添加规则
        //01.查询所有
        // 如果match()方法匹配  content://com.pxd.peopleprovider/student路径,返回匹配码为1
        uriMatcher.addURI("com.pxd.peopleprovider","student",1);//添加需要匹配uri,如果匹配就会返回匹配码
        //02.查询单个 
        // 如果match()方法匹配 content://com.pxd.peopleprovider/student/3路径,返回匹配码为2
        uriMatcher.addURI("com.pxd.peopleprovider","student/#",2);//#号为通配符

注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数

@Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //根据URI匹配器开始匹配Uri
        int code=uriMatcher.match(uri);
        switch (code) {
            case 1:
                //查询所有
                Log.i("test","query所有");
                //获取数据库中所有的数据
                return db.query(false,"student",projection,selection,selectionArgs,null,null,sortOrder,null);
            case 2:
                //查询单个
                //获取# 的值
                long id= ContentUris.parseId(uri);
                Log.i("test","query单个");
                return db.rawQuery("select * from student where _id=?",new String[]{id+""});
        }
        return  null;
    }


使用数据提供者

每个Android组件都有一个ContentResolver对象,通过调用getContentResolver() 方法可得到ContentResolver对象

public class MainActivity extends AppCompatActivity {
private ContentResolver contentResolver;
    private EditText et_main_id;
    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取内容访问者
        contentResolver = getContentResolver();
        et_main_id = (EditText) findViewById(R.id.et_main_id);

    }
    public void getData(View view){
        if(TextUtils.isEmpty(et_main_id.getText().toString())) {
            //查询所有
            //content://
            uri = Uri.parse("content://com.pxd.peopleprovider/student");
        }else {
            //查询单个
            //01.直接query传参
            //02.类似web  http://localhost:8080/webProject/xxx.action?id=3
            //03.Uri匹配器
            String id = et_main_id.getText().toString();
            uri = Uri.parse("content://com.pxd.peopleprovider/student/" + id);
        }
        Cursor cursor= contentResolver.query(uri,null,null,null,null);
        while(cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex("_id"));
            String name=cursor.getString(cursor.getColumnIndex("name"));
            int age=cursor.getInt(cursor.getColumnIndex("age"));
            Log.i("test",id+""+name+""+age);
        }
    }
}


主要操作步骤如上可以实现简单的查询功能。







Android之内容提供者(ContentProvider) 内容提供者(ContentProvider)是Android四大组件之一,用于在不同应用之间共享数据。内容提供者通过统一资源标识符(URI)来标识数据,并使用一套标准的接口来访问和操作数据。它是Android系统中实现跨应用数据共享的主要方式。 阅读详情

相关推荐

解读Autoware.Universe规划模块:Behavior Path Planner

Behavior Path Planner是一个基于行为生成不同形态路径的路径规划器,负责生成 基于交通状况的路径(path), 车辆可以移动的可行驶区域(drivable area)(在路径消息中定义), 将被发送到车辆接口的转向信号(turn signal) 命令。

策 5491

安卓四大组件之ContentProvider

安卓四大组件之ContentProvider

似霰的博客 5935

单片机如何获得5V电源

在单片机实际设计中,有时会需要在电路中用到5V电压源,那么这个常见的实验需求有哪些办法解决呢,我综合网上的资料,概括一下: 1)USB    这种方法在我们直接将单片机板与电脑连接调试的时候,算是简单又方便的办法了,但如果我所要得到的成品不直接连接外部的器件,这就得舍弃。     常用的,USB/5V插头线,这是一种专门的电源线,一端是USB通用接口,可以直插USB端口,另一端是内正外负电压

Echo_Ana的博客 3万+

Android ContentProvider

Android contentprovider

Jun_P的博客 4417

转录组分析中的Fastp和FastQC:如何快速检测数据质量并优化流程

本文深入探讨了转录组分析中数据质量控制的核心流程,重点介绍了Fastp和FastQC两款工具的组合应用。FastQC负责对原始测序数据进行全面质量评估,生成可视化报告;Fastp则能一站式完成接头切除、低质量序列过滤、长度筛选等关键质控步骤。文章提供了详细的参数解读、实战脚本和自动化流程构建指南,帮助研究人员快速检测数据质量并优化预处理流程,为下游的差异表达等分析奠定可靠基础。

weixin_28452161的博客 181

【数据库】SQL Server 2008 R2 安装全流程详解与常见问题避坑指南

本文详细解析了SQL Server 2008 R2的完整安装流程与核心配置。从安装前的系统兼容性检查、.NET Framework依赖准备,到图文详解实例配置、混合身份验证模式设置等关键步骤,并提供了安装失败、服务无法启动等高频问题的排查与避坑指南,帮助用户顺利完成部署。

java5的博客 1241

Android中的ContentProvider

Android中的ContentProvider

QYgujingjing的专栏 2134

大模型微调部署实战及类GPT工具的高效使用

本文主要介绍了专栏《大模型微调部署实战及类GPT工具的高效使用》的核心内容,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 专栏亮点 3. 你的收获 4. 详细目录

herosunly的博客 22万+

Android ContentProvider使用

ContentProvider前言一、ContentProvider是什么?二、使用步骤1.访问方式2.创建ContentProvider2.1. 构建ContentProvider步骤2.2. Uri讲解3.查询4.插入5.修改6.删除总结 前言 我们需要了解ContentProvider最好的方式就是查看Android官方文档: ContentProvider基础知识. 通常ContentProvider有两种使用场景 一种是通过实现代码访问其他应用中的现有内容提供程序; 另一种是在应用中创建新的内

Silicon_Valley 1万+

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

R语言基于机器学习三分类结果、计算三分类混淆矩阵、计算每一个类别对应的特异度(specificity)、灵敏度(sensitivity)、PPV、NPV

data+scenario+science+insight 647

π0.5部署实战(一) ------ 在Thor上使用NVFP4量化

此篇文章是pi05模型在thor上部署系列文章的第一篇.主要介绍如何对pi05 2.6B LLM(Gemma)使用nvfp4进行量化.所有操作使用开源工具可以先参考进行环境的准备和安装,在上完成以下操作.

happyAnger6的专栏 400

在android如何使用ContentProvider

Android中内置了一些content providers是属于公开的数据类型,比如audio(声音)、video(视频)、images(图像)、 personal contact information(通讯录)等。那么如何使用Content Provider呢?下面简单介绍一下: 实现Android.provider package,并使用以下四种方式来增删改查Content Provid

Ada168855的专栏 770

Orange3实战教程:实例---文本分类

我们可以使用预测模型按作者、类型、情感等对文档进行分类。在此工作流中,我们根据文档的Aarne Thompshon Uther索引对文档进行归类,这是故事的主题定义。我们使用两个简单的学习器,Logistic回归和朴素贝叶斯,两者都可以在诺谟图中检查。然后再从可视化分类中添加列线图组件,观察哪些词对逻辑回归最重要。也可以尝试使用在朴素贝叶斯模型上,并编辑连线属性。再从模型中添加朴素贝叶斯模型,以尝试不同的学习器。

err2008的专栏 384

Android中ContentProvider的使用

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

Listening_music的专栏 6124

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 总结:ContentProvider 的使用

在Content Provider中使用的查询字符串有别于标准的SQL查询。诸如select, add, delete, modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成:代表数据的路径,一个可选的标识数据的IDcontent://media/internal/images 这个URI将返回设备上存储的所有图片content://contacts/people/ 这个URI将返回设备上的所有联系人信息。

2501_90499378的博客 654

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

在 Android 中使用 SQLite, ContentProvider

08.在 Android 中使用 SQLite, ContentProvider 09.数据库支持(SQLite) - Android 开发平台提供了操作 SQLite 数据库的相关 API 10.内容提供器(ContentProvider) - 当数据需要在应用程序之间共享时,可以在某程序中使用 ContentProvider 定义 URI, 以使其它应用程序可以通过此 URI 访问指定的数据 11. 12. 13.1、SQLite 的 Demo 14

abby_dcy的专栏 5756

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

安卓开发学习之ContentProvider的使用

背景这几天在学习安卓进程间通信,而做为安卓四大组件之一的内容提供者,也可以实现IPC。现在记录一下使用步骤步骤1、创建DatabaseOpenHelper内容提供者的工作方式就和数据库操作是一样的,增删改查,所以我们要先创建一个帮助类来创建数据库,代码如下public class MyDbHelper extends SQLiteOpenHelper { public static fin...

四国棋客 1248

Android之ContentProvider使用

1.适用场景1) ContentProvider为存储和读取数据提供了统一的接口2) 使用ContentProvider,应用程序可以实现数据共享3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)2.相关概念介绍1)ContentProvider简介 当应用继承ContentProvider...

weixin_34309435的博客 270

Android-ContentProvider简单使用

/***************************MainActivity**********************************************/ package com.cs.dxm.contentprovidertest; import android.content.ContentResolver; import android.content.Conten...

dxm809的博客 653
下一篇: Android之MediaPlayer(两种)基本使用方式
d_shadow
博客等级 码龄10年 42粉丝 10原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值