目录

设计目标

功能说明

代码解析

Myresolver

MainActivity

AndroidManifest.xml

ContentProvider

MyDBhelper

MyDAO

MyContentProvider

实验结果

实验总结

gitee的代码仓库的地址


设计目标

contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;

建一个provider,然后在另一个app中使用resolver调用这个provider。

实现数据获取并得到正确结果

功能说明

首先new两个Empty Activity的Project分别命名为Myresolver和ContentProvider。

对于每一个应用程序来说,如果想要访问内容提供器中共享的数据,就一定要借助Content-Resolver类,可以通过Context中的getContentResolver()方法获取到该类的实例。Content-Resolver中提供了一系列的方法用于对数据进行CRUD操作,其中insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,query()方法用于查询数据。不同于SQLiteDatabase, ContentResolver中的增删改查方法都是不接收表名参数的,而是使用一个Uri参数代替,这个参数被称为内容URI。内容URI给内容提供器中的数据建立了唯一标识符,它主要由两部分组成:authority和path。而我在Myresolver中实现了添加数据的操作。

内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。ContentProvider是Android四大组件之一,其本质上是一个标准化的数据管道,它屏蔽了底层的数据管理和服务等细节,以标准化的方式在Android 应用间共享数据。用户可以灵活实现ContentProvider所封装的数据存储以及增删改查等,所有的ContentProvider 必须实现一个对外统一的接口(URI)。使用的时候需要在androidmanifest.xml文件中注册provider。我在ContentProvider中增加了MyDBhelper用来初始化数据库,MyContentProvider为新建的一个类取继承ContentProvider的方式来创建一个自己的内容提供器并重写了相关内容,MyDAO来完成数据和uri的相关问题

以下分别为ContentProvider和Myresolver的相关文件

代码解析

Myresolver

MainActivity

通过Context中的getContentResolver()方法获取到该类的实例

ContentResolver resolver=getContentResolver();

然后用

Uri uri=Uri.parse("content://zty.provider1/student");来表明uri的内容

用ContentValues values=new ContentValues();来填写相关内容

最后使用resolver.insert(uri,values);来实现数据的插入工作,具体代码如下

package com.example.myresolver;import androidx.appcompat.app.AppCompatActivity;import android.content.ContentResolver;
import android.content.ContentValues;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button=findViewById(R.id.button);ContentResolver resolver=getContentResolver();Uri uri=Uri.parse("content://zty.provider1/student");ContentValues values=new ContentValues();values.put("name","zty");values.put("age",20);values.put("sex","男");button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {resolver.insert(uri,values);}});}
}

AndroidManifest.xml

为了提高安全性会进行权限配置,而其中的名字可以在创建的ContentProvider中找到

<queries><package android:name="com.example.contentprovider"></package></queries>

ContentProvider

MyDBhelper

用于初始化数据库,数据库名为ztyDB,表名为student并进行了表的相关设定,代码如下

package com.example.contentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;import androidx.annotation.Nullable;public class MyDBhelper extends SQLiteOpenHelper {public MyDBhelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, "ztyDB", null, version);Log.d("zty","MyDBhelper is running....");}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL("create table student(" +"id integer primary key AUTOINCREMENT,name varchar(20),age integer,sex varchar(20) )");Log.d("zty","onCreate is running....");}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}}

MyDAO

新建一个java class命名为MyDAO作为数据库访问类,首先定义了构造方法,参数为上下文,使用到了前面定义的数据库,并使用getWritableDatabase来返回一个数据库可读写对象database,然后新建一个ztyInsert的方法函数用于往数据库力传参数。insert的返回类型是long,用ContentUris的withAppendedId方法将id追加到Uri后面返回到contentresolver的insert中,用inserturi来接受参数。在数据库发生变化的时候我们调用notifyChange方法,及时更新,通知那个uri数据发生了变化,以便及时更新页面。 代码如下

package com.example.contentprovider;import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.util.Log;public class MyDAO {private SQLiteDatabase database;Context context;private  Uri uri=Uri.parse("content://zty.Provider1");public MyDAO(Context context){this.context=context;MyDBhelper dBhelper=new MyDBhelper(context,"ztyDB",null,1);database=dBhelper.getWritableDatabase();}public  Uri ztyInsert(){ContentValues values=new ContentValues();values.put("name","纳西妲");values.put("age",21);values.put("sex","女");long id=database.insert("student",null,values);Uri inserturi = ContentUris.withAppendedId(uri, id);context.getContentResolver().notifyChange(inserturi,null);return inserturi;}}

MyContentProvider

新建的一个类来继承ContentProvider的方式来创建一个自己的内容提供器, 其中的

URI Anthorities要填写正确需要的内容,我填的为zty.provider1.在其中有6中抽象方法,我们本次只需要填写噢onCreate和insert两种方法,只有当Myresolver尝试访问数据时,才会被初始化。在insert中运用MyDAO中的ztyInsert中的数据来添加,返回一个新的URI。代码如下

package com.example.contentprovider;import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;public class MyContentProvider extends ContentProvider {private MyDAO myDAO;private Context context;public MyContentProvider() {}@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");}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO: Implement this to handle requests to insert a new row.return myDAO.ztyInsert();}@Overridepublic boolean onCreate() {// TODO: Implement this to initialize your content provider on startup.context=this.getContext();myDAO=new MyDAO(context);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO: Implement this to handle query requests from clients.throw new UnsupportedOperationException("Not yet implemented");}@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");}
}

实验结果

实验总结

这次的实验还是一个比较难的操作,在实验中出现了很多问题,开始时代码都写好了,不报错,但是一运行就会出现错误,后来才发现运行时要把两个app都运行不能只运行一个,还有就是要在 AndroidManifest.xml填写正确的packge名,能够正确识别并找到位置。也让我对于Contentprovder的理解更加深刻,对于数据存储的有关知识也有了更深的理解。uri也是一个很重要的内容。通用资源标志符(Universal Resource Identifier, 简称"URI")。Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。从概念上来讲,URI包括URL。Uri的通用格式为:scheme: scheme-specific-part #fragment。

对于数据跨应用的运用有了初步的了解,通过不断的学习将会有更深入的理解。resolver

和contentprover两个互相作用的过程有了初步的认知。对于添加的操作还是有一些陌生,但在老师的细心教导下还是做了出来,以后会学习相关知识自己完成更新,删除等操作。

gitee的代码仓库的地址

https://gitee.com/zhang-tian_yu/Android.git

移动开发-contentprovider进行数据获取相关推荐

  1. 安卓开发之利用contentprovider进行数据获取

    简述: contentprovider:是安卓四大组件之一,是实现应用程序间数据共享最标准的方式. 若A提供数据给B,则A写contentprovider,B写resolver将数据释放出来. 本次实 ...

  2. Kinect for Windows V2和V1对比开发___彩色数据获取并用OpenCV2.4.10显示

    V1彩色分辨率:640x480 V2彩色分辨率:1920x1080 1,打开彩色图像帧的方式 对于V1: 使用NuiImageStreamOpen方法打开 hr = m_PNuiSensor-> ...

  3. 微信小程序开发---连接云开发数据库,实现数据获取

    之前几篇博客里面都详细交代了如何配置云函数,现在就讲一下关于云函数中数据库的使用,主要是讲如何从云开发平台的数据库中调取数据 我们直接来到需要调用数据库数据的页面的js文件,直接设置全局变量,来便于后 ...

  4. Android中ContentProvider组件数据共享

    ContentProvider的功能和意义: 主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中 ...

  5. Android--简单开发和使用ContentProvider数据共享

    今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子: 我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你 ...

  6. Android面试专题 | 大厂安卓开发高频面试真题174问(附详细答案)

    每年求职季就是修罗场,无数人削尖了脑袋想进大厂,我身边当然不乏和我一样心怀大厂梦的人,但大家也都清楚进入大厂的难度有多高. 在入职谷歌之前我也曾经历无数坎坷,陷入过技术瓶颈和人生低谷,面试前艰苦的复习 ...

  7. 技术报告:程序员如何开发一个商城型购物网站

    前言 随着互联网的快速发展,电商行业正成为越来越多人的选择.而作为电商行业的主要参与者之一,商城型购物网站的开发则成为程序员不可避免的任务之一.本文将对商城型购物网站的开发进行详细阐述,包括需求分析. ...

  8. 信贷评分卡--开发流程篇

    目录 一.评分卡介绍 二.数据收集 三.数据准备 3.1. 数据准备包括:处理异常值.缺失值.定义好坏客户.样本量.定义样本窗口期等. 3.2. 变量可视化:可助于寻找特征数据之间的关系和发现问题. ...

  9. Android高级终端开发学习笔记(《疯狂Android讲义》第2章-第10章)

    Android疯狂讲义前10章知识点总结 /-------------------------10-31号晚上学习笔记----------------------------/ 在设置了最小支持版本为 ...

最新文章

  1. 基于 eBPF 的新型追踪工具:bpftrace
  2. 【背景建模】基于时空特征(续2)
  3. 14条最佳JS代码编写技巧
  4. Cesium学习笔记(四)Camera
  5. Java Web使用数据库连接池
  6. adb命令中的keyevent事件
  7. 如何更换ppt模板内容不变_如何制作一个优秀的PPT?附18000+套精品PPT模板
  8. 【论坛项目】简单的论坛小项目-麻雀虽小,五脏俱全
  9. python连数据库课程设计报告_sql数据库课程设计报告书
  10. W10注册表及其打开方法
  11. 查看计算机内存条型号,怎么查内存条型号 这几步你要了解
  12. 马斯克与Twitter风波大戏
  13. 中考考试的指令广播_2019年初中学业水平考试广播指令
  14. 适合年轻人的副业项目,想要赚钱养家就不要再懒了
  15. NP管理器 NPManager v3.0.49 安卓APK逆向反编译工具
  16. 北京全市医保定点医疗机构直接社保
  17. Apache站点下载大文件不完整原因及解决办法(128M自动中断)
  18. 红外线遥控协议简介(NEC格式)
  19. html页面计算圆的周长和面积,计算圆的周长和面积(VB)
  20. HP EliteDesk 800 G4 DM 35W (Japan) Mini Tower黑苹果efi引导文件

热门文章

  1. keil的数据波形如何在电脑示波器软件keil array visualization显示
  2. Salesforce市场活动及其渠道归因
  3. 考研英语图画类大作文
  4. Web Api出现500 Internal Server Error 错误
  5. 一文了解常用的微波传输线(一)
  6. 趣图:不得了,日本出版社是这样吸引死宅们学编程的
  7. 蓝牙模块--OTA升级
  8. 【正点原子FPGA连载】第三十五章高速AD/DA实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  9. 雪落时刻,天地寂静,静静地落
  10. Android在任何地方模拟点击屏幕