你的位置:首页 > 软件开发 > 操作系统 > android菜鸟学习笔记21

android菜鸟学习笔记21

发布时间:2015-07-11 16:00:07
ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用。只有当需要在多个应用之间共享数据时才会用到ContentProvider。多个应用共享数据时,如何区分是哪个应用中的那部分数据呢?Conten ...

android菜鸟学习笔记21

ContentProvider是Android四大组件之一,它用来封装数据,并通过ContentResolver接口将数据提供给其他应用。只有当需要在多个应用之间共享数据时才会用到ContentProvider。

多个应用共享数据时,如何区分是哪个应用中的那部分数据呢?

ContentProvider通过Uri标识具体某个应用的某些数据。当一个应用提供了ContentProvider向其他应用共享数据时,该应用在其ContentProvider中添加标识自己特定数据的Uri,然后其他应用想要获得这些数据时,则可以通过向ContentResolver接口的方法传入标识要访问的数据的Uri即可。

 android菜鸟学习笔记21

如应用B和应用C都向外提供数据,他们就需要在自己提供的ContentProvider中分别指明自己所能解析的Uri。应用A要访问应用B和应用C提供的数据,就需要使用ContentResolver接口,要向该接口的访问数据的方法中传入特定的Uri以区分是要访问应用B的数据,还是要访问应用C的数据。

应用之间共享数据需要用到的类和接口有:ContentProvider、ContentResolver、Uri、UriMatcher、ContentUris等。

下面一一学习这几个类和接口的简单使用:

1)ContentProvider:

该类是一个抽象类,要在自己应用中使用ContentProvider对象,需要自定义类继承ContentProvider类,并实现几个主要的抽象方法:

 android菜鸟学习笔记21

onCreate()方法: 其它应用第一次访问该ContentProvider时被调。

insert()方法:外部应用使用此方法添加数据。

delete()方法:外部应用使用此方法删除数据。

update  ()方法:外部应用使用此方法更新数据。

query()方法:外部应用使用此方法查询数据。

getType()方法: 主要用于匹配数据类型,返回当前Uri所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/自定义类型。数据属于非集合类型数据,应该返回vnd.android.cursor.item/自定义类型。

2)ContentResolver:

是一个接口,可以通过Context.getContentResolver()获取该接口的实例,当在自己应用中要访问别的应用ContentProvider提供的数据时,需要获取该接口的实例,然后调用该接口的insert()、update()、query()、delete()等方法,最终会调用对应ContentProvider中同名的方法,实现共享数据的增删改查操作。

3)Uri:

也是一个抽象类。

Uri标准的格式是:schema://主机名authority/path[/ID]

后面的ID部分根据访问需要,可能没有。

如:content://cn.csc.app1/student标识要访问的是cn.csc.app1所标识的应用中的student表。

ContentProvider中Uri的schema部分一般为content://

authority用来标识要访问的是哪个ContentProvider,通常用能唯一标识应用的包名作为authority。

path部分,则标识我们要访问的是哪些数据,如student表示我们要访问的是student表的数据。

若加上ID部分,如content://cn.csc.app1/student/10,一般被用来表示我们要访问的是student表中的id为10的那条数据。

uri中可以使用通配符:

*:表示匹配任意长度的字符串

#:表示匹配任意长度的数字串

如匹配任意表的uri可以表示为:content://cn.csc.app1/*

匹配student表中任意一条记录的uri:content://cn.csc.app1/student/#

常用到的是Uri中的一个静态方法:

 android菜鸟学习笔记21

parse()用来将字符串表示的uri解析为Uri对象。

4)UriMatcher:

 android菜鸟学习笔记21

Uri匹配的一个工具类,一般用在ContentProvider中:

一般使用常量NO_MATCH作为参数,构造UriMatcher对象,然后调用addURI()方法向该对象中添加URI,使用match()方法判断传入的Uri的匹配结果。

addURI()方法的参数说明:

authority:Uri中的authority用于标识是哪个ContentProvider

path:Uri中的path部分,标识要操作的是哪张表

code:用于设置当前添加的Uri的标识码,当使用match方法,传入一个Uri参数时,会将匹配到的Uri对应的code返回,以指明当前匹配到哪个Uri。

5)ContentUris:

一个实用的对Uri进行操作的工具类

 android菜鸟学习笔记21

parseId():用来获取传入的Uri中的Id部分

withAppendId():用于将传入的Uri和id拼接起来。

 

下面是实际编写ContentProvider的一个简单示例:

第一步:要先有一个数据库帮助类,以便于进行数据库增删改查操作

 1 package cn.csc.content_provider.db; 2  3  4  5 import android.content.Context; 6  7 import android.database.sqlite.SQLiteDatabase; 8  9 import android.database.sqlite.SQLiteOpenHelper;10 11 import android.database.sqlite.SQLiteDatabase.CursorFactory;12 13 import android.util.Log;14 15 16 17 public class MySqliteHelper extends SQLiteOpenHelper {18 19    public static final String TAG = "MYSQLITEHELPER";20 21    public static final String CREATE_STUDENT = "create table t_student (" +22 23         "id integer primary key, name varchar(20), " +24 25         "gender varchar(10), age integer)";26 27    public static final String CREATE_TEACHER = "create table t_teacher(" +28 29         "id integer primary key, name varchar(20))";30 31    public MySqliteHelper(Context context, String name, CursorFactory factory,32 33         int version) {34 35      super(context, name, factory, version);36 37    }38 39 40 41    @Override42 43    public void onOpen(SQLiteDatabase db) {44 45      Log.i(TAG,"open db");46 47      super.onOpen(db);48 49    }50 51 52 53    @Override54 55    public void onCreate(SQLiteDatabase db) {56 57       db.execSQL(CREATE_STUDENT);58 59       db.execSQL(CREATE_TEACHER);60 61    }62 63 64 65    @Override66 67    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {68 69 70 71    }72 73 }

原标题:android菜鸟学习笔记21

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录