Content Provider基础(一)初识和访问其它程序中数据的方法
来源:互联网 发布:电动螺丝刀知乎 编辑:程序博客网 时间:2024/06/15 23:38
一.初识
Android数据持久化技术有文件存储,SharedPreferences存储,数据库存储。每种方式有自己的适用情况。但是这些持久化技术所保存的数据只能在当前应用程序中访问。实现跨程序数据共享的功能要通过Android四大组件之一------》内容提供器Content Provider实现。
哪些数据通常情况下需要共享?系统的电话簿程序中的联系人数据,短信,媒体库(MP3,AVI,JPG等等)
Content Provider可以选择只对哪一部分的数据进行共享,从而保证我们程序中的隐私数据不会泄露,安全性高
Content Provider的用法通常有两种:
1.使用现有的内容提供器来读取和操作相应程序中的数据
2.创建自己的内容提供其给我们程序的数据提供外部访问接口
即获取与付出!
获取永远是简单的,那就先从获取来学习!
二.访问其它程序中的数据
前提是其它程序要提供外部访问接口
自己在工作中的一个UDP通信项目没有接触到这一部分,而是在和威哥学习音乐播放器实战的时候才开始接触,其中有这么一段代码是用来获取所有MP3信息的。
public static ArrayList<Mp3Info> getMp3Infos(Context context) { System.out.println(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Audio.Media.DURATION+ ">=180000", null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); ArrayList<Mp3Info> mp3Infos = new ArrayList<Mp3Info>(); for (int i = 0; i < cursor.getCount(); i++) { cursor.moveToNext(); Mp3Info mp3Info = new Mp3Info(); long id = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); //歌曲ID String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); //音乐标题 String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); //歌手 String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); //专辑名 long albumId = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); //专辑ID long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); //时长 long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)); //文件大小 String url = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); //文件路径 int isMusic = cursor.getInt(cursor.getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); //是否为音乐 if (isMusic != 0) { mp3Info.setId(id); mp3Info.setTitle(title); mp3Info.setArtist(artist); mp3Info.setAlbum(album); mp3Info.setAlbumId(albumId); mp3Info.setDuration(duration); mp3Info.setUrl(url); } mp3Infos.add(mp3Info); } cursor.close(); return mp3Infos; }我们发现如果要访问内容提供器中共享的数据,必须要用ContentResolve类。我们可以通过上下文Context的getContentResolve()方法获取该类的实例对象。该类提供了一系列方法去实现CRUD(增删改查)操作。方法如下:
insert()
delete()
update()
query()
不同于数据库接CRUD收到的参数是表名,内容提供器CRUD接收到的参数是内容URI,内容URI给内容提供器中的数据建立了唯一标识符,主要由三部分组成:协议(protocal)和权限(authority)和路径(path)
权限通常为应用程序包名,路径用于区分同一应用程序中不同的表.
例如,以下URI字符串: content://com.exemple.zjz.provider/table1
但是我们要传入参数时必须是一个Uri对象,需要通过Uri uri = Uri.parse(" content://com.exemple.zjz.provider/table1")获取到Uri对象才可以
再比如我们上一段代码中MediaStore.Audio.Media.EXTERNAL_CONTENT_URI打印出来为:content://media/external/audio/media</p><p>
下面具体介绍一下各个方法:
1.查询 Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
具体的参数解释:
还是以上一段获取MP3音乐的代码为例
Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null,
MediaStore.Audio.Media.DURATION+">=180000", null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
uri 内容Uri,指定查询某个应用程序下的某一张表
projection 指定查询的列名
selection 指定约束条件
selectionArgs 为约束条件中的占位符提供具体的值
orderBy 指定查询结果的排序方式
查询完成后返回Cursor对象,就可以将数据从Cursor里面逐个读取出来,先读行后读列,详细的参考上面的代码。
2.插入
ContentValue values = new ContentValues();
values.put("column1", "text");
values.put("column2", 1);
getContentResolver().insert(uri, values);
3.更新
ContentValues values = new ContentValues();
values.put("column1", "updateText");
getContentResolver().update(uri, values, "column1=? and column2=?", new String[]{"text", "1"});
3.删除
getContentResolver().delete(uri, "column2=?", new String[]{"1"});
- Content Provider基础(一)初识和访问其它程序中数据的方法
- Content Provider基础(一)
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一)——总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
- 【codeforces 576D】LCS Again
- Educational Codeforces Round 5-B. Dinner with Emma(贪心)
- android中ImageView属性及其详解
- IOS程序异常crash捕获与拦截
- 移动app的左右滑隐藏菜单
- Content Provider基础(一)初识和访问其它程序中数据的方法
- jar包冲突解决
- Windows 7系统BAT批处理修改IP地址和DNS
- Springmvc异步支持报错
- 每天学习十分钟13之网页静态化①
- ISim技巧
- C++枚举类型enum
- IP组播技术介绍及实现例子
- [POJ 3295]Tautology[构造][DFS]