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"});



0 0