ContentProvider 学习

来源:互联网 发布:17173魔兽世界数据库 编辑:程序博客网 时间:2024/05/29 19:04

ContentProvider 主要用于应用间数据共享(也能说是进程间数据共享)。

ContentProvider 和ContentResolver 提供了类似一组标准的接口,前者负责数据提供,通过后者来访问前者提供的数据。ContentProvider 类似服务端,ContentResolver类似客户端。

ContentProvider 下面的数据一般对应sqlite数据库里的数据。(我想也可以是File)

ContentProvider 提供CRUD操作。

ContentProvider 和 ContentResolver自动处理进程间通信。

ContentProvider 是 其内部数据 和 外部以表形式展示的数据 间的一个抽象层。

要访问provider需要在清单文件中注册相应的权限


ContentUri

ContentUri 包括 authority (provider name) + path(table)

content://user_dictionary/words
scheme :// authority/path

Uri,Uri.Builder,ContentUri


用ContentResolver获取数据要在非Ui线程中。


一个ContentResolver.query()的查询语句,

mCursor = getContentResolver().query(    UserDictionary.Words.CONTENT_URI,   // The content URI of the words table    mProjection,                        // The columns to return for each row    mSelectionClause                    // Selection criteria    mSelectionArgs,                     // Selection criteria    mSortOrder);                        // The sort order for the returned rows

其实就是去匹配下面这个sql语句

SELECT _ID, word, locale FROM words WHERE word = <userinput> ORDER BY word ASC;
要哪些列,满足条件的行,按什么顺序。需要匹配用户输入的变量在mSelectionArgs里,在mSelectionClause中用占位符 ? 。


防止Sql注入

用?,而不要用连接 var = userinput  (验证)


Cursor,用个ListView或者SimpleCursorAdapter来处理query返回的Cursor,但Cursor对应的表中必须有行_id.


权限管理:

provider 要想被其他应用访问,必须声明权限,其他应用申请对应权限,用户授权后其他应用就可以访问了。provider应用内的其他组件有完全的读写权限,不管provider声明权限与否。

声明权限:在<provider>子标签<android:grantUriPermission>


3种访问Provider的方式:

批处理,异步查询,发送intent



0 0
原创粉丝点击