您的位置:首页 > 其它

Content Provider基础(一)初识和访问其它程序中数据的方法

2016-01-12 11:09 351 查看
一.初识

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"});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: