博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Content Provider Guides
阅读量:5817 次
发布时间:2019-06-18

本文共 4432 字,大约阅读时间需要 14 分钟。

 

Android Content Provider Guides

 

  Content Providers管理对结构化数据集的访问。它们包装数据,并且提供一种定义数据安全的机制。

  Content providers是不同进程间数据连接的标准接口。

  要获取content provider中的数据,需要运用你的应用中的 中的对象作为一个client来和provider交互。

  这个provider对象是一个实现了接口的类的对象。Provider对象从clients那里获取数据请求,执行请求的动作,然后返回结果。

  

  如果你不想和其他的应用分享数据,你就不必开发自己的provider,但是,如果你需要在应用中提供自定义的搜索建议,或者你需要从你的应用复制粘贴复杂的数据和文件到其他的应用,你还是需要开发自己的provider。

  Android系统包含了管理各种数据的content provider,可管理的数据包括音频、视频、图像、个人通讯信息等。可以看看这个包: 。在一些限制条件下,这些providers是可以被任何Android应用访问的。

Content Provider Basics

  Content Provider管理对中央数据库的访问,是Android应用的一部分,经常会提供一些UI来操作数据。

  然而,content providers主要是用来被其他应用使用的,其他应用通过一个client对象来访问provider。

  providers和provider clients一起,提供了持续、标准的接口来访问数据,其中还包含了一些跨进程通信和数据访问安全相关的东西。

  Content provider向外部应用呈现数据的方式像关系型数据库中的表(但是底层实现并不一定要求是数据库)。

  provider没有要求必须有主键,也没有要求必须有一列叫_ID,然而,如果想要绑定数据到ListView中,就得有一列叫_ID。

访问provider

  一个应用想要访问content provider中的数据,需要通过一个 客户端对象。

  这个客户端对象中有一些方法会调用provider对象中的同名方法。

  provider对象是 的实现类的实例。 

  中的方法提供了基本的“CRUD”(create, retrieve, update, and delete)数据操作。

   对象在客户端应用的进程中, 对象在拥有provider的应用中,它们会自动处理跨进程通信。  也是一个抽象层,处在数据仓库(底层)和数据表(外部表现)之间。

  为了访问provider,应用通常需要声明一些权限,见 。

Content URI

  Content URI中包含了provider的符号名(authority)和一个指向数据表的路径名(path)。

  当你调用客户端方法来访问provider中的表的时候,参数中会需要一个content URI。

  对象会解析URI的authority,使用它和系统已知的providers的表做对比,来resolve出provider

  之后 就可以把查询的参数分发给正确的provider了。

  会使用content URI的path来选择要访问的table,一个provider通常会为每一个table提供一个path。

  比如:

  content://user_dictionary/words

  user_dictionary是authority,words是table的path

  content:// (the scheme)说明这个字符串是一个content URI。

 

  很多providers会允许在URI后面加上ID值来访问table中的行。

  一些有用的类:  

Retrieving Data from the Provider

  数据查询操作通常需要在一个非UI的线程异步执行,可以参考 guide。

  从一个provider中查询数据,通常需要两步:

  1.获取这个provider的读权限;

  2.定义好向这个provider查询语句。

  官方Guides里写了例子,还讲了防SQL注入等相关的考虑。

/* * This defines a one-element String array to contain the selection argument. */String[] mSelectionArgs = {""};// Gets a word from the UImSearchString = mSearchWord.getText().toString();// Remember to insert code here to check for invalid or malicious input.// If the word is the empty string, gets everythingif (TextUtils.isEmpty(mSearchString)) {    // Setting the selection clause to null will return all words    mSelectionClause = null;    mSelectionArgs[0] = "";} else {    // Constructs a selection clause that matches the word that the user entered.    mSelectionClause = UserDictionary.Words.WORD + " = ?";    // Moves the user's input string to the selection arguments.    mSelectionArgs[0] = mSearchString;}// Does a query against the table and returns a Cursor objectmCursor = getContentResolver().query(    UserDictionary.Words.CONTENT_URI,  // The content URI of the words table    mProjection,                       // The columns to return for each row    mSelectionClause                   // Either null, or the word the user entered    mSelectionArgs,                    // Either empty, or the string the user entered    mSortOrder);                       // The sort order for the returned rows// Some providers return null if an error occurs, others throw an exceptionif (null == mCursor) {    /*     * Insert code here to handle the error. Be sure not to use the cursor! You may want to     * call android.util.Log.e() to log this error.     *     */// If the Cursor is empty, the provider found no matches} else if (mCursor.getCount() < 1) {    /*     * Insert code here to notify the user that the search was unsuccessful. This isn't necessarily     * an error. You may want to offer the user the option to insert a new row, or re-type the     * search term.     */} else {    // Insert code here to do something with the results}

 

Displaying query results

  查询的结果是一个  ,包含了满足查询条件的行,projection所指定的列。

  如果没有满足条件的行,会返回一个空Cursor(  为0)。

  如果查询时发生了内部错误,根据具体provider,结果会有所不同,有可能会返回null,或者有可能会抛出异常

  Cursor对象提供对其包含行列的随机访问。

  使用Cursor中的方法,你可以遍历结果中的行,得到每一列的数据类型,得到某一列数据,查看结果的其他属性等等。

  一些 的实现类会在provider数据变化时自动更新数据,或者在Cursor改变时激发一些观察者方法,或这两都有。

  展示查询数据可以用 或用绑定到ListView中去。

  要绑定Cursor数据到ListView中,cursor必须包含一列叫_ID。

Inserting, Updating, and Deleting Data

Insert

  插入数据用 :这个方法会返回新插入的行的URI,比如:content://user_dictionary/words/<id_value>

  数据是放在类的对象中,_ID列是provider自动维护的不需要自己写,providers通常会将_ID作为主键。

  为了从URI中获取id,可以调用 方法。

Update

  Update的时候,首先根据选择条件进行查询,然后对其中的值进行更改,和插入一样,采用对象。

  采用的方法是 。

Delete

  删除和查询差不多,设置选择条件,然后找到要删除的行,客户端方法会返回删除的行的个数。

  删除用的方法是 。

  更新和删除的时候都要注意是否有用户的恶意操作,参见:.。

 

参考资料

  API Guides: Content Providers

  

  Content Provider Basics

  

 

 

转载地址:http://pzwdx.baihongyu.com/

你可能感兴趣的文章
jquery checkbox
查看>>
并发和并行的区别
查看>>
多线程——@synchronized(object)
查看>>
应用程序正常初始化(0xc015002)失败解决方法
查看>>
Grunt学习一:使用grunt创建jquery plugin.
查看>>
第十六章:网络IPC:套接字
查看>>
求二进制数中1的个数
查看>>
oracle扩展dblink数。
查看>>
Swift2.0语言教程之类的嵌套与可选链接
查看>>
SVN常用命令
查看>>
同时大量连接导致的DDOS攻击,导致收发器宕机,用户大面积超时掉线
查看>>
开始QT+OpenCV学问
查看>>
教你修改Linux下高并发socket最大连接数所受的各种限制
查看>>
2、redis原生的命令操作不同数据类型
查看>>
ThinkPad E431怎样关闭触摸板
查看>>
Myeclipse优化篇
查看>>
hibernate 使用in方式删除数据
查看>>
jquery选择器(综合)
查看>>
孙悟空为何打不赢取经路妖怪?太上老君道出了实情
查看>>
在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案...
查看>>