4.四大组件之内容提供者 ContentProvider
内容提供者介绍

按照我们上节课创建的数据库,按照linux里的权限规则,每三个一组,第一组表示自己的权限,第二组表示与自己同组的权限,第三组表示第三方用户的权限。
所以,第三方用户是没有权限执行本应用的内容的。于是,就需要这么一个内容提供者了。
内容提供者应用场景:
向日历里插入提醒事件:
微信、QQ,支付宝获取通讯录里的联系人
安卓媒体库:比如说要发朋友圈了,或者应用要上传图片,获取系统里的图片内容视频内容也可以通过内容提供者获取。
广告精准推送:去淘宝后,头条也能收到推荐。
例子
public class UserProvider extends ContentProvider
我们的四大组件,每次创建都得去注册!
<provider android:authorities="com.example.mycontentprovider" android:name=".provider.UserProvider"/>
android:authorities目前来说一般填包名
authorities 就是个令牌,让我们如何找到它 一般填写包名

接着我们之前复习的数据库代码进行搭建,现在我们写内容提供者:
package com.example.mycontentprovider2.provider; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; import com.example.mycontentprovider2.db.MydbHelper; import com.example.mycontentprovider2.utils.Contants; //内容提供者是给别的app提供内容的 public class UserProvider extends ContentProvider { /***************目前这样的话数据库内容谁都能拿到了,咋办?用uri控制一下****/ private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //匹配码 private static final int USER_MATCH_CODE = 1; static { //添加一些uri规则(path怎么用我们后面再说) uriMatcher.addURI("com.example.mycontentprovider2",null,USER_MATCH_CODE); } /***********************提供数据库的内容*************************************/ MydbHelper mydbHelper; public UserProvider() { } //系统自动调用 @Override public boolean onCreate() { //如果没创建数据库或者表就创建,双保险 mydbHelper = new MydbHelper(getContext()); return false; } /***************************增删改查现在我们看的很熟悉吧**********************/ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //匹配一下规则 int result = uriMatcher.match(uri); if (result == USER_MATCH_CODE){ //匹配规则 SQLiteDatabase db = mydbHelper.getWritableDatabase(); Cursor cursor = db.query(Contants.TB_NAME, projection, selection, selectionArgs, null, null, sortOrder); return cursor; }else { //不匹配规则 我给他抛出一个参数违法异常 throw new IllegalArgumentException("主动抛的参数违法异常"); } } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // Implement this to handle requests to delete one or more rows. throw new UnsupportedOperationException("Not yet implemented"); } @Override public Uri insert(Uri uri, ContentValues values) { // TODO: Implement this to handle requests to insert a new row. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO: Implement this to handle requests to update one or more rows. throw new UnsupportedOperationException("Not yet implemented"); } @Override public String getType(Uri uri) { // TODO: Implement this to handle requests for the MIME type of the data // at the given URI. throw new UnsupportedOperationException("Not yet implemented"); } }
现在我们写内容解析者 点击按钮即可获取数据
//通过内容解析者拿到内容提供者提供的内容 public void myGetProvider(View view) { ContentResolver contentResolver = getContentResolver(); //解析规则 Uri uri = Uri.parse("content://com.example.mycontentprovider2"); Cursor cursor = contentResolver.query(uri, null, null, null, null); String[] columnNames = cursor.getColumnNames(); //打印出数据库表的表头 for (String columnName : columnNames) { Log.e("数据库表的表头",columnName); } //遍历数据 while (cursor.moveToNext()){ for (String columnName : columnNames) { String string = cursor.getString(cursor.getColumnIndex(columnName)); Log.e("字段名"+columnName,string); } } cursor.close(); }
关于path


条件


浙公网安备 33010602011771号