ContentProvider(内容提供者)是Android中的四大组件之中的一个。

主要用于对外共享数据。也就是通过ContentProvider把应用中的数据共享给其它应用訪问。其它应用能够通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自己定义的,系统的也就是比如联系人,图片等数据。

下面这段是Google Doc中对ContentProvider的大致概述。

内容提供者将一些特定的应用程序数据供给其他应用程序使用。

数据能够存储于文件系统、SQLite数据库或其他方式。

内容提供者继承于ContentProvider 基类,为其他应用程序取用和存储它管理的数据实现了一套标准方法。然而,应用程序并不直接调用这些方法,而是使用一个 ContentResolver 对象,调用它的方法作为替代。ContentResolver能够与随意内容提供者进行会话。与其合作来对全部相关交互通讯进行管理。

1.ContentProvider

Android提供了一些主要数据类型的ContentProvider。比方音频、视频、图片和私人通讯录等。可在android.provider包以下找到一些Android提供的ContentProvider。通过获得这些ContentProvider能够查询它们包括的数据。当然前提是已获得适当的读取权限。

主要方法:

public boolean onCreate() 在创建ContentProvider时调用

public Cursor query(Uri, String[], String, String[], String) 用于查询指定Uri的ContentProvider。返回一个Cursor

public Uri insert(Uri, ContentValues) 用于加入数据到指定Uri的ContentProvider中

public int update(Uri, ContentValues, String, String[]) 用于更新指定Uri的ContentProvider中的数据

public int delete(Uri, String, String[]) 用于从指定Uri的ContentProvider中删除数据

public String getType(Uri) 用于返回指定的Uri中的数据的MIME类型

*假设操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头。

比如:要得到全部person记录的Uri为content://contacts/person,那么返回的MIME类型字符串为"vnd.android.cursor.dir/person"。

*假设要操作的数据属于非集合类型数据。那么MIME类型字符串应该以vnd.android.cursor.item/开头。

比如:要得到id为10的person记录的Uri为content://contacts/person/10,那么返回的MIME类型字符串应为"vnd.android.cursor.item/person"。

2.ContentResolver

当外部应用须要对ContentProvider中的数据进行加入、删除、改动和查询操作时,能够使用ContentResolver类来完毕,要获取ContentResolver对象,能够使用Context提供的getContentResolver()方法。

view plaincopy to clipboardprint?

ContentResolver cr = getContentResolver();

ContentResolver提供的方法和ContentProvider提供的方法相应的有下面几个方法。

public Uri insert(Uri uri, ContentValues values) 用于加入数据到指定Uri的ContentProvider中。

public int delete(Uri uri, String selection, String[] selectionArgs) 用于从指定Uri的ContentProvider中删除数据。

public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用于更新指定Uri的ContentProvider中的数据。

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用于查询指定Uri的ContentProvider。

3.Uri

Uri指定了将要操作的ContentProvider,事实上能够把一个Uri看作是一个网址。我们把Uri分为三部分。

第一部分是"content://"。能够看作是网址中的"http://"。

第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用须要依据这个标识来找到它。能够看作是网址中的主机名,比方"blog.csdn.net"。

第三部分是路径名,用来表示将要操作的数据。能够看作网址中细分的内容路径。



// 查找sdcard卡上的全部歌曲信息

public List> getMultiData() {

ArrayList> musicList = new ArrayList>();

// 增加封装音乐信息的代码

// 查询全部歌曲

ContentResolver musicResolver = this.getContentResolver();

Cursor musicCursor = musicResolver.query(

MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,

null);

int musicColumnIndex;

if (null != musicCursor && musicCursor.getCount() > 0) {

for (musicCursor.moveToFirst(); !musicCursor.isAfterLast(); musicCursor

.moveToNext()) {

Map musicDataMap = new HashMap();

Random random = new Random();

int musicRating = Math.abs(random.nextInt()) % 10;

musicDataMap.put("musicRating", musicRating);

// 取得音乐播放路径

musicColumnIndex = musicCursor

.getColumnIndex(MediaStore.Audio.AudioColumns.DATA);

musicPath = musicCursor.getString(musicColumnIndex);

musicDataMap.put("musicPath", musicPath);

// 取得音乐的名字

musicColumnIndex = musicCursor

.getColumnIndex(MediaStore.Audio.AudioColumns.TITLE);

musicName = musicCursor.getString(musicColumnIndex);

musicDataMap.put("musicName", musicName);

// 取得音乐的专辑名称

musicColumnIndex = musicCursor

.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM);

musicAlbum = musicCursor.getString(musicColumnIndex);

musicDataMap.put("musicAlbum", musicAlbum);

// 取得音乐的演唱者

musicColumnIndex = musicCursor

.getColumnIndex(MediaStore.Audio.AudioColumns.ARTIST);

musicArtist = musicCursor.getString(musicColumnIndex);

musicDataMap.put("musicArtist", musicArtist);

// 取得歌曲相应的专辑相应的Key

musicColumnIndex = musicCursor

.getColumnIndex(MediaStore.Audio.AudioColumns.ALBUM_KEY);

musicAlbumKey = musicCursor.getString(musicColumnIndex);

String[] argArr = { musicAlbumKey };

ContentResolver albumResolver = this.getContentResolver();

Cursor albumCursor = albumResolver.query(

MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null,

MediaStore.Audio.AudioColumns.ALBUM_KEY + " = ?

",

argArr, null);

if (null != albumCursor && albumCursor.getCount() > 0) {

albumCursor.moveToFirst();

int albumArtIndex = albumCursor

.getColumnIndex(MediaStore.Audio.AlbumColumns.ALBUM_ART);

musicAlbumArtPath = albumCursor.getString(albumArtIndex);

if (null != musicAlbumArtPath

&& !"".equals(musicAlbumArtPath)) {

musicDataMap.put("musicAlbumImage", musicAlbumArtPath);

} else {

musicDataMap.put("musicAlbumImage",

"file:///mnt/sdcard/alb.jpg");

}

} else {

// 没有专辑定义,给默认图片

musicDataMap.put("musicAlbumImage",

"file:///mnt/sdcard/alb.jpg");

}

musicList.add(musicDataMap);

}

}

return musicList;

}

以下是用ContentProvider读取联系人数据,属于系统数据。完整代码下载:android_contentprovider_system.rar

注意:这里的联系人操作有点乱。关键是我还不是非常熟,SDK1.6和SDK2.1的联系人操作非常有非常大不同,希望哪位大侠指点一下。

view plaincopy to clipboardprint

" href="http://blog.csdn.net/zhoujiyu123/article/details/6992027">?

public class MainActivity extends Activity {

private EditText nameET;

private EditText numberET;

private Button insertBtn;

private Button deleteBtn;

private Button queryBtn;

private ListView contentView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

nameET = (EditText) findViewById(R.id.name);

numberET = (EditText) findViewById(R.id.number);

insertBtn = (Button) findViewById(R.id.insert);

deleteBtn = (Button) findViewById(R.id.delete);

queryBtn = (Button) findViewById(R.id.query);

// 用于显示数据

contentView = (ListView) findViewById(R.id.content);

insertBtn.setOnClickListener(new OperateOnClickListener());

deleteBtn.setOnClickListener(new OperateOnClickListener());

queryBtn.setOnClickListener(new OperateOnClickListener());

}

class OperateOnClickListener implements OnClickListener {

@Override

public void onClick(View v) {

String name = nameET.getText().toString();

String number = numberET.getText().toString();

Person p = new Person(name, number);

switch (v.getId()) {

// 插入数据

case R.id.insert:

insert(p);

view();

break;

// 删除数据

case R.id.delete:

delete(name);

view();

break;

// 查询数据

case R.id.query:

view();

break;

}

}

}

// 显示数据

private void view() {

Cursor c = query("");

ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,

c, new String[] { People._ID, People.NAME, People.NUMBER },

new int[] { R.id.id, R.id.name, R.id.number });

contentView.setAdapter(listAdapter);

}

// 插入联系人

private void insert(Person p) {

// 获得ContentResolver对象

ContentResolver cr = getContentResolver();

ContentValues values = new ContentValues();

values.put(People.NAME, p.name);

// 表示是否把联系人增加到收藏(加星)。1表示增加,0表示不增加,这行代码凝视默认是不增加。

values.put(Contacts.People.STARRED, 1);

Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);

// 获得联系人People表的Uri

Uri url = Uri.withAppendedPath(uri,

Contacts.People.Phones.CONTENT_DIRECTORY);

values.clear();

values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);

values.put(Contacts.Phones.NUMBER, p.number);

// 插入操作

cr.insert(url, values);

}

// 插入联系人

private void delete(String name) {

// 获得ContentResolver对象

ContentResolver cr = getContentResolver();

Uri url = Contacts.People.CONTENT_URI;

// 设置删除条件

String where = People.NAME + "=?";

String[] selectionArgs = { name };

cr.delete(url, where, selectionArgs);

}

// 查询联系人

private Cursor query(String name) {

// 获得ContentResolver对象

ContentResolver cr = getContentResolver();

Uri uri = Contacts.People.CONTENT_URI;

// 查询对象

String[] projection = { People._ID, People.NAME, People.NUMBER };

// 设置查询条件,这里我把selection和selectionArgs參数都设为null。表示查询所有数据

String selection = null;

String[] selectionArgs = null;

if (!"".equals(name)) {

selection = People.NAME + "=?";

selectionArgs = new String[] { name };

}

// 设置排序条件

String sortOrder = Contacts.People._ID;

Cursor c = cr.query(uri, projection, selection, selectionArgs,

sortOrder);

// if (c.moveToFirst()) {

// for (int i = 0; i < c.getCount(); i++) {

// c.moveToPosition(i);

// String name = c.getString(c.getColumnIndexOrThrow(People.NAME));

// String number = c.getString(c

// .getColumnIndexOrThrow(People.NUMBER));

// }

// }

return c;

}

}

Android 开发 ContentProvider 获取歌曲列表和联系人的样例的更多相关文章

  1. Android开发之获取xml文件的输入流对象

    介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...

  2. android开发如何获取res/raw和assets文件夹的路径

    ---恢复内容开始--- android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况: 1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以, ...

  3. Android开发调试常用命令列表

    Android开发调试常用命令列表 adb命令 am am start -n com.iflytek.autofly.account/.ui.MainActivity am start -n com. ...

  4. Android ListView 和 ***Adapter 从本地/网络获取歌曲列表

    本文内容 环境 项目结构 测试数据 演示 1:SimpleAdapter 演示 2:BaseAdapter 演示 3:CustomLazyList 演示 4:CustomLazyCompleteLis ...

  5. android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

    上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...

  6. Android开发——RecyclerView实现下载列表

    本篇记录的是使用Jsoup框架爬取网页内容,结合Android的RecyclerView,从而实现批量下载小说的功能(也是我的APP星之小说下载器Android版的核心功能),思路仅供参考 本文使用了 ...

  7. android开发之——获取相册图片和路径

    Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managed ...

  8. Android开发之获取手机SIM卡信息

    TelephonyManager是一个管理手机通话状态.电话网络信息的服务类.该类提供了大量的getXxx(),方法获取电话网络的相关信息. TelephonyManager类概述: 可用于訪问有关设 ...

  9. Android开发16——获取网络资源之基础应用

    一.项目背景在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据.本博文介绍了获取另一个web项目的资源.有一个web项目,在其WebRoot文件夹下 ...

随机推荐

  1. [转]c# 对密码执行散列和 salt 运算方法

    本文转自:http://www.cnblogs.com/CnBlogFounder/archive/2008/07/04/1235690.html 大家对密码执行散列和Salt运算一定不陌生.两个Vi ...

  2. Python--10、线程

    线程 每个进程里都有一个控制线程,进程不是一个执行单位,线程是执行单位,进程是资源单位(资源隔离).进程下可以开多个线程,多线程共享进程内的资源.创建线程的速度比创建进程的速度快,因为创建线程不需要再 ...

  3. 挂载硬盘,提示 mount: unknown filesystem type 'LVM2_member'的解决方案

    问题现象:由于重装linux,并且加了固态硬盘,直接将系统装在固态硬盘中.启动服务器的时候, 便看不到原来机械硬盘的挂载目录了,不知如何访问机械硬盘了.直接用命令 mount /dev/sda3 /s ...

  4. js获取某年某月一共多少天

    const getDaysInMonth = (year, month) => { let date = new Date(year, month, 1); return new Date(da ...

  5. JS高级——浏览器的线程

    基本概念 1.js的执行过程是单线程的模式,也就是同步进行,只有前面的代码执行完了才会往下面执行 2.但是执行js代码也只是浏览器的线程之一所负责的事情,这个线程被称为js引擎,浏览器还具有其他线程: ...

  6. MyEclipse中VSS的使用详解

    本文系转载,原文地址http://hi.baidu.com/yi88cheng/blog/item/13dd862f765e6b5c4fc226e5.html

  7. 【转】npm 是干什么的

    https://blog.csdn.net/zouzhigang96/article/details/79071854 网上的 npm 教程主要都在讲怎么安装.配置和使用 npm,却不告诉新人「为什么 ...

  8. OpenCV3 Java 机器学习使用方法汇总

    原文链接:OpenCV3 Java 机器学习使用方法汇总  前言 按道理来说,C++版本的OpenCV训练的版本XML文件,在java中可以无缝使用.但要注意OpenCV本身的版本问题.从2.4 到3 ...

  9. 【LaTeX】对xelatex的中英文设置不同的字体

    不建议用Ctex套装,不好用. 用MixTex+TexStudio! XeTeX处理中文非常方便,不需要任何设置,就能够使用系统中安装的TrueType和OpenType字体. MikTeX2.7中已 ...

  10. 利用 CSS animation 和 CSS sprite 制作动画

    CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择.今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动 ...