• Android 开发 ContentProvider 获取歌曲列表和联系人的样例


    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?

    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;

    }

    }

  • 相关阅读:
    代理 XP”组件已作为此服务器安全配置的一部分被关闭。系统管理员可以使用 sp_configure 来启用“代理 XP”。
    sql 操作常用操作语句 新增、修改字段等
    easyui 日期控件清空值
    jQuery文件上传插件jQuery Upload File 有上传进度条
    js中文乱码怎么解决【转】
    [转]SqlSever2005 一千万条以上记录分页数据库优化经验总结【索引优化 + 代码优化】一周搞定
    SqlBulkCopy批量添加数据
    常用正则表达式
    查询每张表的大小
    Jquery里的特定小技巧
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6914967.html
Copyright © 2020-2023  润新知