安卓核心组件三ContentProvider

安卓核心组件三ContentProvider

  • 简介:ContentProvider实现了在不同应用间的数据共享,这个核心组件的使用频率相对较小,主要是访问安卓系统中的数据,例如联系人数据共享、短信数据共享、图片和音乐等媒体数据共享
  • 如何实现内容共享请参考以下代码

`public class StudentContentProvider extends ContentProvider {
private static UriMatcher matcher;
private static String authority = "cn.myapp.providers.student";
private static final int MATCH_ROOT = 1;
private static final int MATCH_PATH = 2;
private static final int MATCH_ID = 3;
private String table = "student";

static {
    matcher = new UriMatcher(UriMatcher.NO_MATCH);
    matcher.addURI(authority, null, MATCH_ROOT);
    matcher.addURI(authority, "hello", MATCH_PATH);
    matcher.addURI(authority, "#", MATCH_ID);
}

@Override
public boolean onCreate() {

    return false;
}

@Override
public Cursor query(Uri uri, String[] columns, String selection,
        String[] selectionArgs, String orderBy) {
    SQLiteDatabase db = new DbOpenHelper(getContext())
            .getReadableDatabase();
    Cursor c = null;
    switch (matcher.match(uri)) {
    case MATCH_ROOT:
        // content://cn.tedu.providers.student/
        c = db.query(table, columns, selection, selectionArgs, null, null,
                orderBy);
        break;

    case MATCH_ID:
        // content://cn.tedu.providers.student/5
        long id = ContentUris.parseId(uri);
        if(selection != null && !"".equals(selection)) {
            selection += " and _id=" + id;
        }
        c = db.query(table, columns, selection, selectionArgs, null, null, orderBy);
        break;
    }

    return c;
}

@Override
public String getType(Uri uri) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    if(matcher.match(uri) == MATCH_ROOT) {
        SQLiteDatabase db = new DbOpenHelper(getContext())
                .getReadableDatabase();
        long id = db.insert("student", null, values);
        return ContentUris.withAppendedId(uri, id);
    }
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    throw new IllegalArgumentException("不允许执行删除操作!");
}

@Override
public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs) {
    // TODO Auto-generated method stub
    return 0;
}

很少用到这个部分的内容,因为除了系统其他的app很注重自己的数据安全,不会开放给其他的应用使用
- ContentProvider的主要应用:访问系统的数据,如联系人,音频,视频,图片,短信等等


ContentResolver cr = getContentResolver();
    Uri uri = Media.EXTERNAL_CONTENT_URI;
    Cursor c = cr.query(uri, null, null, null, null);

    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        Log.d("media store", c.getString(c.getColumnIndex("_data")));

这段代码的作用就是获取系统的所有的图片,是通过访问了系统的sqlite数据库来实现的,在data文件下可以找到这些数据库。


public List<Music> getData() {
    ContentResolver cr = cw.getContentResolver();
    Uri uri = Media.EXTERNAL_CONTENT_URI;
    Cursor c = cr.query(uri, null, null, null, null);

    List<Music> data = new ArrayList<Music>();
    Music music;
    for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        music = new Music();

        music.setId(c.getLong(c.getColumnIndex("_id")));
        music.setData(c.getString(c.getColumnIndex("_data")));
        music.setAlbum(c.getString(c.getColumnIndex("album")));
        music.setArtits(c.getString(c.getColumnIndex("artist")));
        music.setDuration(c.getInt(c.getColumnIndex("duration")));
        music.setTitle(c.getString(c.getColumnIndex("title")));

        data.add(music);
    }
    return data;
}

这段代码的作用就是获取系统的所有音频
- 补充:相应的数据库文件的位置:
- 音频:data/data/com.android.providers.media/databases/externel.db
- data/data/这个位置下有一系列的com.android.*命名的文件,都是系统提供的相应数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值