Android复习08【内容提供者】
2020-04-14-第9周-周二
目 录
思维导图
资源网站
添加手机联系人
Android使用MediaStore获取手机上的文件
日历操作
手机联系人
MainActivity.java
MyHelper.java
PersonCp.java
思维导图
https://share.weiyun.com/1vVLYnlb
资源网站
菜鸟教程---4.4.1 ContentProvider初探
https://www.runoob.com/w3cnote/android-tutorial-contentprovider.html
https://www.cnblogs.com/sparrowlhl/p/11239530.html
https://developer.android.google.cn/guide/topics/providers/content-provider-creating
https://www.jb51.net/article/122840.htm
添加手机联系人
静态代码块---自动执行一次。
Android使用MediaStore获取手机上的文件
https://blog.csdn.net/yann02/article/details/92844364
日历操作
手机联系人
MainActivity.java
package cn.wangzg.personcp;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}
MyHelper.java
package cn.wangzg.personcp;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;/*** Time: 2020/4/13* Author: wangzhiguo* Description: 功能描述*/
public class MyHelper extends SQLiteOpenHelper {public MyHelper(@Nullable Context context) {super(context, "person.db", null, 1);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table person(id integer primary key autoincrement," +"name varchar(20),phone varchar(12),salary Integer(12))");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}
PersonCp.java
package cn.wangzg.personcp;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;import java.util.Objects;/*** Time: 2020/4/13* Author: wangzhiguo* Description: 功能描述*/
public class PersonCp extends ContentProvider { //数据库作为数据源,将数据保存到数据库中。private MyHelper mHelper;private final static String AUTHORITY = "cn.wangzg.personprovider";private static UriMatcher mUriMatcher;private static final int PERSON_DIR = 0;private static final int PERSON = 1;/*** 利用静态代码块初始化UriMatcher* 在UriMatcher中包含了多个Uri,每个Uri代表一种操作* 当调用UriMatcher.match(Uri uri)方法时就会返回该uri对应的code;* 比如此处的PERSONS和PERSON*/static {mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 该URI表示返回所有的person,其中PERSONS为该特定Uri的标识码mUriMatcher.addURI(AUTHORITY, "person", PERSON_DIR);// 该URI表示返回某一个person,其中PERSON为该特定Uri的标识码mUriMatcher.addURI(AUTHORITY, "person/#", PERSON);}/*** 在自定义ContentProvider中必须覆写getType(Uri uri)方法.* 该方法用于获取Uri对象所对应的MIME类型.* <p>* 一个Uri对应的MIME字符串遵守以下三点:* 1 必须以vnd开头* 2 如果该Uri对应的数据可能包含多条记录,那么返回字符串应该以"vnd.android.cursor.dir/"开头* 3 如果该Uri对应的数据只包含一条记录,那么返回字符串应该以"vnd.android.cursor.item/"开头*/@Overridepublic String getType(Uri uri) {switch (mUriMatcher.match(uri)) {case PERSON_DIR:return "vnd.android.cursor.dir/" + AUTHORITY + ".persons";case PERSON:return "vnd.android.cursor.item/" + AUTHORITY + ".person";default:throw new IllegalArgumentException("unknown uri" + uri.toString());}}@Overridepublic boolean onCreate() {mHelper = new MyHelper(getContext());return true;}/*** 插入操作:* 插入操作只有一种可能:向一张表中插入* 返回结果为新增记录对应的Uri* 方法db.insert()返回结果为新增记录对应的主键值*/@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = mHelper.getWritableDatabase();switch (mUriMatcher.match(uri)) {case PERSON_DIR:long newId = db.insert("person", "name,phone,salary", values);//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应getContext().getContentResolver().notifyChange(uri, null);return ContentUris.withAppendedId(uri, newId);default:throw new IllegalArgumentException("unknown uri" + uri.toString());}}/*** 更新操作:* 更新操作有两种可能:更新一张表或者更新某条数据* 在更新某条数据时原理类似于查询某条数据,见下.*/@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {SQLiteDatabase db = mHelper.getWritableDatabase();int updatedNum = 0;switch (mUriMatcher.match(uri)) {// 更新表case PERSON_DIR:updatedNum = db.update("person", values, selection, selectionArgs);break;// 按照id更新某条数据case PERSON:long id = ContentUris.parseId(uri);String where = "id=" + id;if (selection != null && !"".equals(selection.trim())) {where = selection + " and " + where;}updatedNum = db.update("person", values, where, selectionArgs);break;default:throw new IllegalArgumentException("unknown uri" + uri.toString());}//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应Objects.requireNonNull(getContext()).getContentResolver().notifyChange(uri, null);return updatedNum;}/*** 删除操作:* 删除操作有两种可能:删除一张表或者删除某条数据* 在删除某条数据时原理类似于查询某条数据,见下.*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = mHelper.getWritableDatabase();int deletedNum = 0;switch (mUriMatcher.match(uri)) {// 删除表case PERSON_DIR:deletedNum = db.delete("person", selection, selectionArgs);break;// 按照id删除某条数据case PERSON:long id = ContentUris.parseId(uri);String where = "id=" + id;if (selection != null && !"".equals(selection.trim())) {where = selection + " and " + where;}deletedNum = db.delete("person", where, selectionArgs);break;default:throw new IllegalArgumentException("unknown uri" + uri.toString());}//向外界通知该ContentProvider里的数据发生了变化 ,以便ContentObserver作出相应Objects.requireNonNull(getContext()).getContentResolver().notifyChange(uri, null);return deletedNum;}/*** 查询操作:* 查询操作有两种可能:查询一张表或者查询某条数据* <p>* 注意事项:* 在查询某条数据时要注意--因为此处是按照id来查询* 某条数据,但是同时可能还有其他限制.例如:* 要求id为2且name为xiaoming1* 所以在查询时分为两步:* 第一步:* 解析出id放入where查询条件* 第二步:* 判断是否有其他限制(如name),若有则将其组拼到where查询条件.* <p>* 详细代码见下.*/@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {SQLiteDatabase db = mHelper.getWritableDatabase();Cursor cursor = null;switch (mUriMatcher.match(uri)) {// 查询表case PERSON_DIR:cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);break;// 按照id查询某条数据case PERSON:// 第一步:long id = ContentUris.parseId(uri);String where = "id=" + id;// 第二步:if (selection != null && !"".equals(selection.trim())) {where = selection + " and " + where;}cursor = db.query("person", projection, where, selectionArgs, null, null, sortOrder);break;default:throw new IllegalArgumentException("unknown uri" + uri.toString());}return cursor;}
}
蟹蟹观看~~~
Android复习08【内容提供者】相关推荐
- android 53 ContentProvider内容提供者
ContentProvider内容提供者:像是一个中间件一样,一个媒介一样,可以以标准的增删改差操作对手机的文件.数据库进行增删改差.通过ContentProvider查找sd卡的音频文件,可以提供标 ...
- Android 使用ContentProvider(内容提供者)查询手机联系
在开发应用程序过程中有时候会关联到用户的手机联系人,在Android的为开发者提供了ContentProvider内容提供者来获取手机的联系人,首先我在模拟器中保存了两个联系人如下所示: lisi:电 ...
- android基础之内容提供者使用
上一篇我们说了我内容提供者的创建.这篇我们主要说下内容提供中的使用方法. 要使用内容提供者,我们需要借助于内容提供者的一个工具类ContentResolver.ContentResolver里面的增删 ...
- Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容...
一.什么是ContentProvider? ContentProvider直译过来就是内容提供者,主要作用就是A应用提供接口给B应用调用数据,和之前介绍的sharedPreference和直接开放文件 ...
- Android存储数据---内容提供者ContentProvider
简介 内容提供者的使用 2. 实例 (1)activity_main.xml <?xml version="1.0" encoding="utf-8"?& ...
- Android中创建内容提供者要继承,Android中创建内容提供者要继承( )。
摘要: 图像则y过(b的一定,中者要图1像如的图已知所示.人不工程定支按约承包酬务报付劳,内容应(.认识同实现状向和醒的个清结果对合.提供趋有一施的.... 图像则y过(b的一定,中者要图1像如的图已 ...
- Android开发14——监听内容提供者ContentProvider的数据变化
一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider:A应用修改了B应用的数据,插入了一条数据.有这样一个需求,此时C应用需要得到数据被修改 ...
- Android 内容提供者(Content provider)
原文地址:http://justsee.iteye.com/blog/936612 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然 ...
- android内容提供者_挖穿Android第三十九天
为什么需要内容提供者 回顾数据库知识: [1]定义一个类继承SqliteOpenHelper [2]想要操作数据库必须获取一个SqliteDatabase对象 [3]chmod修改文件的权限 实际应用 ...
最新文章
- 离开宁静的农村,走进喧嚣的城市:搬家!
- ITK:对给定LabelMap的所有LabelObject应用形态学关闭操作
- 编程语言发展的编年史
- Apache Mahout:适合所有人的可扩展机器学习框架
- P2290-[HNOI2004]树的计数【组合数,Prufer序列】
- JDK线程池CompletionService的使用
- caffe 图片数据的转换成lmdb和数据集均值(转)
- 误区30日谈21-24
- Web容器默认的servlet
- Mybatis 参考
- 逆向工程核心原理笔记
- flash cs4 打不开的解决方法(启动界面一闪而过)
- centOS7 更改主机名localhost.localdomain
- ABB机器人画圆编程_ABB机器人的程序编程
- 【马尔科夫链-蒙特卡罗】马尔科夫链-蒙特卡罗方法对先验分布进行抽样
- 微型计算机原理姚向华答案,微型计算机原理试题答案-微型计算机原理姚向华.doc...
- Python xlwt 操作 excel 表格基础(三):单元格格式、字体格式、对齐方式、边框及填充等
- “一县一店·全国乡土消费社群”平台:助力乡村振兴农产上行
- 多进程统计策略盈亏分布——从零到实盘12
- 生态功能区划方法之二:生态服务功能重要性评价
热门文章
- linux串口传文件除了rz,使用sz/rz基于串口传输文件
- java list 移除_java 中List删除实例详解
- php对象怎么拆分字符串数组,在PHP中将字符串拆分为Unicode字符数组的最佳方法是什么?...
- web服务器是如何维护,我们如何维护Web客户端和Web服务器之间的会话?
- 四、深入elasticsearch中文搜索
- 三、新手Jupyter不会用,我十招教你盘她
- python的shell无法输入_python中shell如何逐行输入?
- 国外方案 组件化_网页webp解决方案
- 直播预告 | AAAI 2022论文解读:基于生成模型的语音/歌声合成与歌声美化
- 直播 | NeurIPS 2021:基于投影变换建模传递关系的知识图谱表示学习