Android开发(7)数据库和Content Provider
问题聚焦:
思想:应用程序数据的共享
对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的
Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据
下面我们由下向上来分析ContentProvider的处理流程:
1 数据库——SQLite
使用者:ContentProvider
映射:Content Value映射为数据库中的表的一行;
查询:Cursor,底层数据中的结果集的指针;
使用:SQLiteOpenHelper,抽象类,用于实现创建、打开和升级数据库
继承该类,重写其构造函数,onCreate方法(创建)和onUpgrade方法(更新)访问:getWritableDatabase方法(获得可写的数据库实例)和getReadableDatabase方法(获取只读的数据库实例)
Demo
/** 插入新行 **/ // 创建要插入的一行新值 ContentValues newValues = new ContentValues(); //为每一个字段赋值 newValues.put(NAME_COLUMN, _name); newValues.put(ADDRESS_COLUMN, _address); ...... //插入到数据库中 SQLiteDatabase db = DBOpenHelper.getWritableDatabase(); db.insert(DBOpenHelper.DATABASE_TABLE, null, newValues);
2 Content Provider
使用者:自身为独立的APP
作用:将使用数据的应用程序组件和底层的数据源分离
使用:ContentProvider,抽象类,继承该类,并重写方法:
注册:通过标记实现,name属性+authorities标记
- onCreate(): 初始化底层的数据源
- query()
- update()
- delete()
- insert()
- getType()
demo:<provider android:name="ArticlesProvider" android:authorities="shy.luo.providers.articles"> </provider>
发布:URI
demo:
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/item"); public static final Uri CONTENT_POS_URI = Uri.parse("content://" + AUTHORITY + "/pos");
使用:应用程序通过ContentResolver与ContentProvider交互
3 ContentResolver——使用ContentProvider
使用者:应用程序
作用:应用程序通过它来查询和操作Content Provdier
特点:ContentProvider提供了底层数据的抽象
ContentResolver提供了查询和处理ContentProvider的抽象使用:通过URI交互
Demo
/** 查询操作 **/ public Article getArticleById(int id) { Uri uri = ContentUris.withAppendedId(Articles.CONTENT_URI, id); String[] projection = new String[] { Articles.ID, Articles.TITLE, Articles.ABSTRACT, Articles.URL }; Cursor cursor = resolver.query(uri, projection, null, null, Articles.DEFAULT_SORT_ORDER); // 获取一个数据库的游标 Log.i(LOG_TAG, "cursor.moveToFirst"); if (!cursor.moveToFirst()) { return null; } String title = cursor.getString(1); String abs = cursor.getString(2); String url = cursor.getString(3); return new Article(id, title, abs, url); }
Uri代表了要操作的数据
格式:content:// 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据
5 小结:
一张图概括一下这章的内容:
ContentProvider作为一个独立的APP
- 与下层的数据源进行交互,使用SQLiteOpenHelper类
- 与上层的应用程序进行教书,使用ContentResolver类+URI
参考文档:
《Android系统源代码情景分析》
《Android高级编程3rd》
ContentProvider和Uri详解: http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html