Android ContentProvider的实现及简单实例代码
程序员文章站
2023-12-20 11:17:52
一、概念及说明
contentprovider定义:
内容提供者是一个android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个con...
一、概念及说明
contentprovider定义:
内容提供者是一个android应用的基础模块,提供内容给这个应用,它们封装数据和提供它给应用通过这个contentresolver接口,使用contentprovider可以在不同的应用程序之间共享数据,android为常见的一些数据提供了contentprovider(视频、音频),contentprovider使用表的形式来组织数据。
uri定义:
每一个contentprovider都拥有一个公共的uri,这个uri用于表示这个contentprovider所提供的数据。android所提供contentprovider都存放在android.provider。
二、实现contentprovider的过程
1。定义contentprovider所需要的常量(最主要的是定义content_uri,content_uri是uri类型,事实是通过字符串解析得到)
//定义contentprovider所需要的常量 public class firstprovidermetadata { // authoriy等于自己的创建contentprovider类的完全路径 public static final string authoriy = "com.example.firstconent.firstcontentprovider"; // 数据库的名称 public static final string database_name = "firstprovider.db"; // basecolumns有两个字段_id和_count public static final class usertablemetadata implements basecolumns { // 表名 public static final string table_name = "t_user"; // 访问该contentprovider的uri public static final uri content_uri = uri .parse("content://" + authoriy); // 表的数据类型 public static final string content_type = "vnd.android.cursor.dir/users"; // 一列的数据类型 public static final string content_item_type = "vnd.android.cursor.item/users"; // 一个字段 public static final string user_name = "name"; // 默认排序 public static final string default_sort_order = "_id desc"; } }
2。定义一个类,继承contentprovider
3。实现query,insert,update,delete,gettype和oncreate方法
(1).定义urimatcher
// 匹配uri,检查uri的合法性 public static final urimatcher urimatcher; public static final int incoming_user_collection = 1; public static final int incoming_user_signle = 2; static { // 创建一个uri树的根结点 urimatcher = new urimatcher(urimatcher.no_match); // 添加uri匹配对,如果这个匹配成功,则code值则会返回。 urimatcher.adduri(firstprovidermetadata.authoriy, "/t_user", incoming_user_collection); urimatcher.adduri(firstprovidermetadata.authoriy, "/t_user/#", incoming_user_signle); }
(2).重写gettype方法
// 根据传入uri,所回该uri所表示的数据类型 @override public string gettype(uri uri) { // todo auto-generated method stub switch (urimatcher.match(uri)) { case incoming_user_collection: return usertablemetadata.content_type; case incoming_user_signle: return usertablemetadata.content_item_type; default: throw new illegalargumentexception("unknown uri" + uri); } }
(3).创建userprojectmap哈希map静态对象
public static hashmap<string, string> userprojectmap; static { userprojectmap = new hashmap<string, string>(); userprojectmap.put(usertablemetadata._id, usertablemetadata._id); userprojectmap.put(usertablemetadata.user_name, usertablemetadata.user_name); }
(4).重写insert方法
// 该方法返回值是一个uri,这个uri表示的刚刚使用这个方法所插入的数据 @override public uri insert(uri uri, contentvalues values) { // todo auto-generated method stub sqlitedatabase db = dbhelper.getwritabledatabase(); // rowid是新插入数据的id long rowid = db.insert(usertablemetadata.table_name, null, values); // 正常插入,-1为出常错误 if (rowid != -1) { // 添加一个id到这个路径的结尾 uri insertuseruri = contenturis.withappendedid( usertablemetadata.content_uri, rowid); // 得到一个contentresolver实例. contentresolver cr = this.getcontext().getcontentresolver(); // 通辞呈数据改变 cr.notifychange(insertuseruri, null); return insertuseruri; } else { throw new sqlexception("failed to insert row into" + uri); } }
(5).重写query方法
@override public cursor query(uri uri, string[] projection, string selection, string[] selectionargs, string sortorder) { // todo auto-generated method stub sqlitequerybuilder sqb = new sqlitequerybuilder(); switch (urimatcher.match(uri)) { case incoming_user_collection: sqb.settables(usertablemetadata.table_name); sqb.setprojectionmap(userprojectmap); break; case incoming_user_signle: sqb.settables(usertablemetadata.table_name); sqb.setprojectionmap(userprojectmap); string idkey = usertablemetadata._id; // 1得到path集合 // 2取它的集合的第2个元素 // 例如:content_uri等于content://com.example.firstconent.firstcontentprovider/t_user/id, // content://为协议 // com.example.firstconent.firstcontentprovider为authoriy // /t_user/id为path string idvalue = uri.getpathsegments().get(1); sqb.appendwhere(idkey + "=" + idvalue); break; } string orderby = null; if (textutils.isempty(sortorder)) { orderby = usertablemetadata.default_sort_order; } else { orderby = sortorder; } sqlitedatabase db = dbhelper.getwritabledatabase(); cursor cursor = sqb.query(db, projection, selection, selectionargs, null, null, orderby); contentresolver cr = this.getcontext().getcontentresolver(); // 通适数据变动 cursor.setnotificationuri(cr, uri); return cursor; }
4。在androidmanifest.xml中声明
<provider android:name="com.example.firstcontent.firstcontentprovider" android:authorities="com.example.first.firstcontent.firstcontentprovider" > </provider>
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
Android ContentProvider的实现及简单实例代码
-
Android编程之杀毒的实现原理及具体实例
-
Android studio 下JNI编程实例并生成so库的实现代码
-
Android实现常见的验证码输入框实例代码
-
android实现ViewPager的Indicator的实例代码
-
Android实现类似iOS风格的对话框实例代码
-
Android Button的基本用法详解及简单实例
-
Android 实现代码混淆的实例
-
Android Listview中显示不同的视图布局详解及实例代码
-
Android 中自定义ContentProvider与ContentObserver的使用简单实例