您的位置:首页 > 编程语言 > PHP开发

安卓核心组件三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.*命名的文件,都是系统提供的相应数据库。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息