ContentProvider 主要用于应用间数据共享(也能说是进程间数据共享)。
ContentProvider 和ContentResolver 提供了类似一组标准的接口,前者负责数据提供,通过后者来访问前者提供的数据。ContentProvider 类似服务端,ContentResolver类似客户端。
ContentProvider 下面的数据一般对应sqlite数据库里的数据。(我想也可以是File)
ContentProvider 提供CRUD操作。
ContentProvider 和 ContentResolver自动处理进程间通信。
ContentProvider 是 其内部数据 和 外部以表形式展示的数据 间的一个抽象层。
要访问provider需要在清单文件中注册相应的权限
ContentUri
ContentUri 包括 authority (provider name) + path(table)
content://user_dictionary/wordsscheme :// 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