ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

内容提供者(ContentProvider)的使用

2021-11-20 17:05:46  阅读:206  来源: 互联网

标签:ContentProvider String Nullable 提供者 Uri 内容 null public lee


有一说一,内容提供者这四大组件基本算是最没牌面的四大组件之一了。做了好几年的开发只听说过这个玩意,还从来没有用过这玩意。
最近项目中需要用到这个组件,需求是子应用的数据存入到数据库(SQLite)中,然后主Launcher应用需要读取修改删除子应用的数据库中的数据,然后就用到了这个ContentProvider。

分析需求实现步骤:
1.子应用中创建SQLite数据库,建好表。
2.子应用中创建好ContentProvider,并且定义好匹配的Uri。
3.ContentProvider中重写对应方法,例如主Launcher只需要查,删,的方法的话子应用的内容提供者中只需要重写query()和delete()方法。
4.主Luancher中调用getContentResolver()获取ContentResolver对象调用对应的方法 传入对应的Uri就行了。

代码:
1.创建数据库:

public class EvaluatDbHelper extends SQLiteOpenHelper {
//创建数据库语句
    private String createTab = "create table evaluat (text text,type text,url text)";

    public EvaluatDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    //建表
        db.execSQL(createTab);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

2.创建内容提供者:

public class EvaluatContentProvider extends ContentProvider {
    private static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    private EvaluatDbHelper dbHelper;

    @Override
    public boolean onCreate() {
    	//添加删除和查询的匹配规则
        uriMatcher.addURI("com.lee.lee.EvaluatContentProvider", "delete", 0);
        uriMatcher.addURI("com.lee.lee.EvaluatContentProvider", "query", 1);
        dbHelper = new EvaluatDbHelper(getContext(), "evaluat", null, 1);
        return false;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    	//重写查询的方法
        if (uriMatcher.match(uri) == 1) {
            SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
            return writableDatabase.query("evaluat", projection, selection, selectionArgs, null, null, null);
        }
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
    //重写删除的方法
        int evaluat = 0;
        if (uriMatcher.match(uri) == 0) {
            SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();
            evaluat = writableDatabase.delete("evaluat", selection, selectionArgs);
        }
        return evaluat;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }
}

既然是组件的话肯定是需要在清单文件中去注册的,这个别忘了,

<provider
            android:authorities="com.lee.lee.EvaluatContentProvider"
            android:name=".EvaluatContentProvider"
            android:exported="true"/>

这里需要注意android:authorities属性中的com.lee.lee.EvaluatContentProvider需要和uriMatcher.addURI(“com.lee.lee.EvaluatContentProvider”, “delete”, 0);中的第一个参数一致 不然是接受不到的。

3.主程序中调用查询和删除的方法。

//这个就是子程序中的定义的Uri  固定格式是content://XXXXXX/需要执行的
public static final Uri  TABLE_EV_query=Uri.parse("content://com.lee.lee.EvaluatContentProvider/query");
//查询子程序的数据库
Cursor cursor = contentResolver.query(TABLE_EV_query, null, null, null, null, null);
这样就获取到了游标
while (cursor.moveToNext()) {
                    StudyRequestBean studyRequestBean = new StudyRequestBean();
                    studyRequestBean.content = cursor.getString(0);
                    studyRequestBean.contentType = cursor.getString(1);
                    studyRequestBean.recording = cursor.getString(2);
                }
                cursor.close();
                这样就把数据库中读取的数据存入至一个StudyRequestBean 类中。
//删除子应用数据库的方法。我这里是全部删除,也可以删除某一项。
 contentResolver.delete(TABLE_EV_delete, null, null);

以上就完成了内容提供者跨应用读取数据的需求。

标签:ContentProvider,String,Nullable,提供者,Uri,内容,null,public,lee
来源: https://blog.csdn.net/qq77485042/article/details/121441551

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有