访问其他程序中的数据(ContentResolver的CRUD操作)

内容提供者(Content Provider)--跨程序共享数据 内容提供者简介 访问其他应用中的数据 ContentResolver 的基本用法 实例读取系统联系人 创建自己的内容提供器 创建内容提供器的步骤 创建新类继承ContentProvider并且重写其中6个方法 内容URI参数 使用UriMatcher实现匹配内容URI的功能 getType函数介绍 实现跨程序数据共享 内容提供者 访问自己创建的内容提供者数据 遇到的问题内容提供者简介 使用场景: 阅读详情

内容提供器的用法一般有两种:

1.使用现有的内容提供器来读取和操作相应程序中的数据

2.创建自己的内容提供器给我们程序的数据提供外部访问接口。

如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序既可以对这部分数据进行访问。Android系统中自带的电话薄、短信、媒体库等程序都提供了类似的访问接口,这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能。

 

ContentResolver的基本用法

对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助ContentResolver类,可以通过Context中的getContentResolver()方法获取到该类的实例。ContentResolver中提供了一系列的方法用于对数据进行CRUD操作,其中insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方法用于查询数据。这和SQLiteDatabase中的CRUD操作还是有点区别的。

不同于SQLiteDatabase,ContentResolver中的增删改查方法都是不接收表名参数的,而是使用一个Uri参数代替,这个参数被称为内容URI。内容URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成:authority和path。

authority:用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。比如某个程序的包名com.example.app,那么该程序对应的authority就可以命名为com.example.app.provider。

path:用于对同一应用程序中不同的表做区分的,通常都会添加到authority的后面。比如某个程序的数据库里存在两张表table1和table2,这时就可以将path分别命名为/table1和/table2,然后把authority和path进行组合,内容URI就变成了com.example.app.provider/table1和com.example.app.provider/table2。

不过,目前还很难辨别出这两个字符串就是两个内容URI,我们还需要在字符串的头部加上协议声明。因此,内容URI最标准的格式写法如下:

协议名://包名.provider/表名

例:

content://com.example.app.provider/table1

content://com.example.app.provider/table2

有没有发现,内容URI可以非常清楚地表达出我们想要访问哪个程序中的哪张表里的数据。也正因此,ContentResolver中的增删改查方法才都接收Uri对象作为参数,因为如果使用表名的话,系统将无法得知我们期望访问的是哪个应用程序里的表。

在得到了URI字符串之后,我们还需要将它解析成Uri对象才可以作为传入。

解析方法:

Uri uri=Uri.pare("content://com.example.app.provider/table1");

只需要调用Uri.parse()方法,就可以将内容URI字符串解析成Uri对象了。

现在我们就可以使用这个Uri对象来查询table1表中的数据了,代码如下所示:

Cursor cursor=getContentResolver().query(

uri,

projection,

selection,

selectionArgs,

sortOrder);

uri:指定查询某个应用程序下的某一张表

projection:指定查询的列名(select column1,column2)

selection:指定where的约束条件(where column = value)

selectionArgs:为where中的占位符提供具体的值

sortOrder:指定查询结果的排序方式(order by column1,column2)

查询完成后返回的仍然是一个Cursor对象,这时我们就可以将数据从Cursor对象中逐个读取出来了。读取的思路仍然是通过移动游标的位置来遍历Cursor的所有行,然后再取出每一行中相应列的数据,代码如下所示:

if(cursor != null){

       while(cursor.moveToNext()){
              String column1=cursor.getString(cursor.getColumnIndext("column1"));

              int column2=cursor.getInt(cursor.getColumnIndext("column2"));

        }
       cursor.close();

}

掌握了最难的查询操作,剩下的增删改操作就比较容易了。

增加数据:

ContentValues cv=new ContentValues();

cv.put("column1","text);

cv.put("column2",1);

getContentResolver().insert(uri,cv);

 

更新数据:

ContentValues cv=new ContentValues();

cv.put("column1","");

getContentResolver().update(uri,cv,"column1 = ? and column2 = ?",new String[]{"text","1"});

注意上述代码使用了selection和selectionArgs参数来对想要更新的数据进行约束,以防止所有的行都会受影响。

 

删除数据:

getContentResolver().delete(uri,"column2 = ?",new String[] {"1"});

这句话的意思是将column2列中,值为1的这一行数据给删除。

android四大组件之ContentProvider(内容提供器) 今天是2022年元旦,普天同庆的日子当然要记一篇优快云,又不是可以永远这么无忧无虑! 闲言少叙,直奔主题! ContentProvider主要用于在不同的程序之间实现数据共享的功能,这是android提供了一套完整的机制,允许一个程序访问另外一个程序中的数据,同时还保证被访数据安全性。 ContentProvider用法一般有两种,一种是使用现有的内容提供器来读取和操作相应程序中的数据,另一种是创建自己的内容提供器给我们的程序提供外部的数据共享接口 1.我们先通过访问android系统自带的电话簿 阅读详情

相关推荐

Android基础学习之ContentProvider

在实际开发中,我们可以根据具体的需求来设计和实现自己的ContentProvider,并在需要的时候注册到AndroidManifest.xml文件中。在上面的代码中,我们首先通过ContentResolver获取到MusicProvider的URI,然后指定需要查询的字段,最后调用query()方法进行查询。ContentProvider的作用可以类比为数据库中的表,它通过URI指定了要访问的表,并提供了一系列的CRUD操作(增删改查),使得其他应用程序可以方便地进行数据的读取和修改。

CodeRoarX的博客 142

contentProvider和contentResolver跨程序访问数据库

  步骤如下           1:在程序中创建数据库和表         2:给每一个表定制一个Uri链接标识        3:定义一个Uri   Uri.parse("content://" + Uri标识+ "/表名");        3:在contentProvider使用  static { matcher.addURI(Uri标识, "表名/#", STUDENT_WITH_I...

lhanwen的博客 609

android程序间数据的共享(ContentProvider和ContentResolver的使用)

安卓程序间数据共享的实现,包含两个程序,共享资源的程序和读取资源的程序,共享资源的程序包含了SQLite数据库的使用。

android ContentProvider读取其他应用数据库

android中,保存和读取数据数据的方式很多种,大致上有网络保存,内存记忆,文件保存和数据库保存。 而应用之间的数据库数据分享,读写,主要用到的便是ContentProvider. 为什么这么说呢? 如果能直接读取数据库文件的话会快很多,然而我们并没有直接读写数据库文件即****.db的权限,即便实在cmd命令下ls目录,也会直接提示 permission denied. 因为我

坚持,努力 5314

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1871

手把手教你构建轻量级CLIP模型:从理论到实践

本文手把手教你从零构建一个轻量级CLIP模型,深入解析其核心原理——对比学习,并提供完整的代码实践。通过精简的模型架构、数据准备和训练循环实现,帮助读者彻底理解多模态模型如何让图像与文本在共享空间中对齐,为学习更复杂的AI模型打下坚实基础。

weixin_29100927的博客 325

【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?

Android--ContentResolver基本用法,如何访问其他应用程序中的数据?如读取电话联系人、短信等。

个人博客 1371

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性包括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理

guigenyi的专栏 1810

Android使用内容提供器(ContentProvider)访问和操作其他程序中的数据

假设我们有2个APP程序(GG和MM),我们想让GG去操作MM中的数据。第一步、在程序MM上自定义一个提供器MyProvider.javapackage com.t20.provider; import com.t20.sqlite.dao.BaseDao; import android.content.ContentProvider; import android.content.Conte...

美奇软件开发工作室 500

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 124

计算机网络期末复习提纲(全知识点总结)

计算机网络期末复习提纲全知识点总结第一章 概述1.基本概念- 链路,结点,协议和服务,实体和对等实体,各层PDU- C/S模式,B/S模式,P2P模式- LAN,WAN,MAN,PAN的划分- 网络性能参数:速率,带宽,吞吐量,时延,往返时间,信道利用率2.互联网的组成(边缘部分与核心部分的作用)3.电路交换与分组交换,数据报交换和虚电路交换的特点4.TCP/IP体系结构,数据的封装与解封装第二章 物理层1.信号编码:不归零编码,曼切斯特编码2.影响信号失真程度的因素3.传输介质:双绞线,同轴电缆,光纤(单

mcyuuji的博客 8万+

ContentResolver——增、删、改(表)

本例中,对 表content://user_dictionary/words 的查询需要请求写入访问权限 即在manifest中添加 <uses-permission android:name="android.permission.WRITE_USER_DICTIONARY" /> 本例中contentResolver ---> 系统提供的contentProvider...

不止于代码 4409

Ansys Lumerical + HFSS + optiSLang 三剑客:手把手教你优化行波MZM调制器(附完整参数配置)

本文详细介绍了如何利用Ansys Lumerical、HFSS和optiSLang三款工具构建自动化协同设计流程,以优化行波马赫曾德尔调制器(TW-MZM)的性能。通过参数化仿真、流程集成与元模型技术,该方案能高效解决多物理场耦合挑战,实现调制带宽、驱动电压等多目标的全局优化,显著提升光子集成芯片的设计效率与性能潜力。

weixin_29251131的博客 583

Android使用ContentResolver访问其他程序中的数据

Android使用ContentResolver访问其他程序中的数据

Android应用开发工程师 2493

NMS非极大值抑制算法原理

NMS非极大值抑制算法

pywin 3500

图神经网络实战(21)——图神经网络的可解释性

在本节中,我们探讨了应用于图神经网络 (Graph Neural Networks, GNN) 的可解释性人工智能 (Explainable Artificial Intelligence, XAI) 技术。可解释性是许多领域的关键要素,可以帮助我们建立更好的模型。我们介绍了不同的局部解释技术,并重点讨论了 GNNExplainer (基于扰动的方法),在图分类任务中应用 GNNExplainer。

盼小辉丶的博客 9511

内容解析器 ContentResolver

注:本文主要摘自developer.android.google.cn/(现在开发者文档里面大多数都有中文版,而且不需要翻墙) 如果有哪里错误,请务必指出,谢谢! 内容提供程序管理对中央数据存储区的访问。提供程序是 Android 应用的一部分,通常提供自己的 UI 来使用数据。 但是,内容提供程序主要旨在供其他应用使用,这些应用使用提供程序客户端对象来访问提供程序。 提供程序与提供程序客户端

Zero的博客 779

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Android高级应用2----ContentProvider(访问手机短信和通讯录数据)

在上一节《Android高级应用1----Service和AIDL》中有介绍过AIDL,作为服务进程间数据访问的接口,而对于像Android自带的SQLite数据库,如果其他的应用程序想要访问该数据库,进行CRUD,同样也需要数据接口,那么这个就是通过ContentProvider来实现,这个虽然在开发过程中,并不会用到太多,大多数是通过后台提供的数据接口来处理,但别忘记,ContentProvider也是Android的4大组件之一。 1、ContentProvider 1个应用程序想要为外界提供数据接口

qq_33235287的博客 1582

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Android 内容提供器---内容提供器基础(访问提供器) .

应用程序使用ContentResolver客户端对象访问来自客户端的数据。这个对象有一些与提供器中相同的命名的方法,提供器是ContentProvider的一个具体的子类的实例。ContentResolver对象的方法提供了基本的“CRUD”(创建、获取、更新和删除)持久化保存的功能。 在客户端应用程序的进程中的ContentResolver对象和提供器自己应用中的ContentProvider...

编程语言小筑 84

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android之ContentProvider跨程序共享数据入门(笔记一)

虽然真正做android开发也快将近一年了,但由于平时开发的内容的缘故,很多知识还是会因为没有用到而被忽略掉,所以最近重新翻回了当时的入门书籍《第一行代码》,发现有不少知识当时是看的一头雾水,现在理解能力多少有些提升了,可以再回来学习,把最基础的四大组件的知识巩固巩固。 以下笔记是我对书里的内容再加上自己的理解进行复述,因为有一种学习方法就是把学过的知识让自己以老师的身份讲出来,会让自己更好地掌

J.D.的博客 1098

5.3 ContentProvider使用全解

点此进入:从零快速构建APP系列目录导图点此进入:UI编程系列目录导图点此进入:四大组件系列目录导图点此进入:数据网络和线程系列目录导图本节例程下载地址: WillFlowContentProvider WillFlowProviderTest一、内容提供器简介内容提供程序管理一组共享的应用数据,用于在不同的应用程序之间实现数据共享的功能。它提供了一套完整的机制,允许一个程序访问另一个程序中的数

WillFlow的博客 1101

Android 内容提供器---内容提供器基础(访问提供器)

应用程序使用ContentResolver客户端对象访问来自客户端的数据。这个对象有一些与提供器中相同的命名的方法,提供器是ContentProvider的一个具体的子类的实例。ContentResolver对象的方法提供了基本的“CRUD”(创建、获取、更新和删除)持久化保存的功能。 在客户端应用程序的进程中的ContentResolver对象和提供器自己应用中的ContentProvider...

编程资料大全 179

Android内容提供程序

内容提供程序基础知识总结

Davidddl的博客 579

【Android】内容提供器

Android 四大组件之一,用于管理应用数据的。

2401_87463988的博客 1015

Android入门笔记(运行时权限与内容提供器)

1 运行时权限 在上几篇文章中,在访问系统的网络状态由于涉及到用户设备的安全性,所以需要使用权限声明,即在 AndroidManifest 中添加 uses-permission 标签,在添加了权限声明后,用户主要在以下两个方面得到保护: 如果用户在低于 6.0 系统的设备中安装该程序,会在该程序的安装界面上出现提醒,让用户从而决定是否安装该程序 安装程序之后,用户可以在应用程序管理界面中查看任...

KeePCoding 223
上一篇: (调用系统电话薄)运行时权限的基本使用
下一篇: 运行时权限+读取系统联系人
Android_牧
博客等级 码龄9年 88粉丝 45原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值