安卓核心组件三ContentProvider
2016-01-07 20:15
621 查看
安卓核心组件三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.*命名的文件,都是系统提供的相应数据库。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories