安卓核心组件三ContentProvider

来源:互联网 发布:2017美国网络星期一 编辑:程序博客网 时间:2024/05/08 06:59

安卓核心组件三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);}@Overridepublic boolean onCreate() {    return false;}@Overridepublic 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;}@Overridepublic String getType(Uri uri) {    // TODO Auto-generated method stub    return null;}@Overridepublic 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;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {    throw new IllegalArgumentException("不允许执行删除操作!");}@Overridepublic 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.*命名的文件,都是系统提供的相应数据库。

0 0
原创粉丝点击