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