问题聚焦:

思想:应用程序数据的共享

对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的

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,抽象类,继承该类,并重写方法:
  • onCreate(): 初始化底层的数据源
  • query()
  • update()
  • delete()
  • insert()
  • getType()

注册:通过标记实现,name属性+authorities标记

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);
}


4 URI

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

最新文章

  1. Multiple View Geometry in Computer vision 1.1节部分翻译
  2. OFFSET IN 使用举例
  3. 重写(Override)与重载(Overload)
  4. Understanding G1 GC Logs--转载
  5. javascript之值传递与引用传递
  6. hdu 1228 A+B 字符串处理 超级大水题
  7. 关于MySQL中使用LOAD DATA INFILE导入csv文件时的日期格式问题
  8. Android SDK更新缓慢或无法更新的解决方法
  9. STL之map和multimap(关联容器)
  10. could not create the java virtual machine(转)
  11. CentOS7安装使用Docker
  12. Centos系统下Lamp环境的快速搭建(超详细)
  13. Spring入门介绍(一)
  14. parted分区详解 查看UUID两种方式 blkid 和 ls -l /dev/disk/by-uuid
  15. vue学习笔记——篇3
  16. java学习之—递归实现二分查找法
  17. heidiSQL使用简介
  18. 洛谷P1525 关押罪犯
  19. Scala_方法、函数、柯里化
  20. vim复制内容到系统剪贴板

热门文章

  1. 001-Servlet模板
  2. 数据库~Mysql派生表注意的几点~关于百万数据的慢查询问题
  3. WPF使用Path画圆的一个示例代码
  4. java外观模式(Facade)
  5. DataGridView 直接修改数据操作
  6. html制作chm格式开源文档
  7. ASP.NET 使用ajaxfileupload.js插件出现上传较大文件失败的解决方法(ajaxfileupload.js第一弹)
  8. 01-Web客户端与服务器详解
  9. C++ STL:stack和queue
  10. python单继沿用父类属性的两种方法