移动开发-contentprovider进行数据获取
目录
设计目标
功能说明
代码解析
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进行数据获取相关推荐
- 安卓开发之利用contentprovider进行数据获取
简述: contentprovider:是安卓四大组件之一,是实现应用程序间数据共享最标准的方式. 若A提供数据给B,则A写contentprovider,B写resolver将数据释放出来. 本次实 ...
- Kinect for Windows V2和V1对比开发___彩色数据获取并用OpenCV2.4.10显示
V1彩色分辨率:640x480 V2彩色分辨率:1920x1080 1,打开彩色图像帧的方式 对于V1: 使用NuiImageStreamOpen方法打开 hr = m_PNuiSensor-> ...
- 微信小程序开发---连接云开发数据库,实现数据获取
之前几篇博客里面都详细交代了如何配置云函数,现在就讲一下关于云函数中数据库的使用,主要是讲如何从云开发平台的数据库中调取数据 我们直接来到需要调用数据库数据的页面的js文件,直接设置全局变量,来便于后 ...
- Android中ContentProvider组件数据共享
ContentProvider的功能和意义: 主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中 ...
- Android--简单开发和使用ContentProvider数据共享
今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子: 我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你 ...
- Android面试专题 | 大厂安卓开发高频面试真题174问(附详细答案)
每年求职季就是修罗场,无数人削尖了脑袋想进大厂,我身边当然不乏和我一样心怀大厂梦的人,但大家也都清楚进入大厂的难度有多高. 在入职谷歌之前我也曾经历无数坎坷,陷入过技术瓶颈和人生低谷,面试前艰苦的复习 ...
- 技术报告:程序员如何开发一个商城型购物网站
前言 随着互联网的快速发展,电商行业正成为越来越多人的选择.而作为电商行业的主要参与者之一,商城型购物网站的开发则成为程序员不可避免的任务之一.本文将对商城型购物网站的开发进行详细阐述,包括需求分析. ...
- 信贷评分卡--开发流程篇
目录 一.评分卡介绍 二.数据收集 三.数据准备 3.1. 数据准备包括:处理异常值.缺失值.定义好坏客户.样本量.定义样本窗口期等. 3.2. 变量可视化:可助于寻找特征数据之间的关系和发现问题. ...
- Android高级终端开发学习笔记(《疯狂Android讲义》第2章-第10章)
Android疯狂讲义前10章知识点总结 /-------------------------10-31号晚上学习笔记----------------------------/ 在设置了最小支持版本为 ...
最新文章
- 基于 eBPF 的新型追踪工具:bpftrace
- 【背景建模】基于时空特征(续2)
- 14条最佳JS代码编写技巧
- Cesium学习笔记(四)Camera
- Java Web使用数据库连接池
- adb命令中的keyevent事件
- 如何更换ppt模板内容不变_如何制作一个优秀的PPT?附18000+套精品PPT模板
- 【论坛项目】简单的论坛小项目-麻雀虽小,五脏俱全
- python连数据库课程设计报告_sql数据库课程设计报告书
- W10注册表及其打开方法
- 查看计算机内存条型号,怎么查内存条型号 这几步你要了解
- 马斯克与Twitter风波大戏
- 中考考试的指令广播_2019年初中学业水平考试广播指令
- 适合年轻人的副业项目,想要赚钱养家就不要再懒了
- NP管理器 NPManager v3.0.49 安卓APK逆向反编译工具
- 北京全市医保定点医疗机构直接社保
- Apache站点下载大文件不完整原因及解决办法(128M自动中断)
- 红外线遥控协议简介(NEC格式)
- html页面计算圆的周长和面积,计算圆的周长和面积(VB)
- HP EliteDesk 800 G4 DM 35W (Japan) Mini Tower黑苹果efi引导文件