Byron's log
‹‹ back
Android 数据操作(个解)
Create Time : 2011-08-04 10:54:35
Modify Time : 2011-08-10 17:13:20

ContentProvider

ContentProvider是Android中对数据共享的一种解决方案,但它更重要的功能是对数据进行统一操作。ContentProvider综合了很多的优点,包括业内热门的机制(URI,REST,Web Service,存储过程) (byron断言) ContentProvider并不会直接应用于业务流程,它的意义在于将数据处理行为转化为Android器件进行操作(注册在AndroidManifest.xml,感觉和Service/Activity/是同一个级别的应用) 在ContentProvider应用中有一个重要的概念就是Uri,书中称为授权(authority),因为android的sqlite数据是私有的,所以说为授权到是挺合理。可以在AndroidManifest.xml中的注册看出uri的特性。
<provider android:name="SomeProvider" android:authorities="com.your-company.SomeProvider" />
对于uri的引用实际的字符串是这样的 content://com.your-company.SomeProvider 这个类似http的uri形式,就是借见Http URL的普级吧。下面再将它分拆成所映射的关系,注意下面例子中说明的映射关系又体现了REST的特性。 content://你的应用(的数据库)/表名/记录编号 ------------------ content://net.bpsky.funybox/books/23 #一个记录 ------------------ content://net.bpsky.funybox/books #一个集合 所以实质Uri是在描述一个记录(如果有编号)或者一个集合(没有编号)。当了解这些至关重要的基本概念后,我们来看下ContentProvider是如何实现的。

ContentProvider实现

Byron只是作流程分析,所会涉及到很多细节的东西还需要大家自行解决。
  1. ContentProvider作为父类被应用所继承,也就是说我们很少将它(可能更本就不会)“裸奔”,通常我们应该一个类派生至ContentProvider
  2. ContentProvider的实现中有四个数据操作方法(query/insert/update/delete),一个类型返回方法(getType),两个重载方法(onCreate/onUpgrade)这些,都是必须重实现的。1) onCreate方法控制着数据库初始化的相关操作(多半是建表);2) onUpgrade方法控制着是数据库版本变化时的操作(应用升级,库结构变更)
  3. query 作为基本查询操作,它是非“伤害性”的所以不需要应用到ContentResolver,而insert/update/delete则是“伤害性”的,所以在数据变更后要cursor.setNotificationUri()
  4. 在ContentProvider中实现的方法不推荐直接写SQLite语句,而提倡使用SQLiteQueryBuilder进行构建。
  5. 因为Uri同时表示两种可能1)单记录2)集合,所以UriMatcher对Uri再作了一次解析的封装
  6. MetaData是一个继承BaseColumns的实现,它是一个库表的描述元集合,所以实质上我们是不会直接操作字符串,而是将字段、URI定义在MetaData类中作为常量。
  7. 最后ContentProvider必须在AndroidManifest.xml中申明,而它最终返回的是一个Cursor数据类型。

最终应用

在实际应用中,ContentProvider语义为:内容提供者。它只是对内容提供,更新,删除进行了封装。在实际操作过程中,并不能直接调用ContentProvier。而是使用代理:ContentResolver(内容解决者)如下。实际上ContentResolver可以使用ContentProvider所实现的方法。
ContentResolver cr = getContentResolver();
ContentValues v = new ContentValues();
//初始化ContentValues....
cr.insert(TableMeta.CONTENT_URI,v);