【Android】进程通信IPC——ContentProvider
16lz
2022-06-04
简介
内容提供者为应用程序提供内容,它封装数据并通过ContentResolver将其提供给应用程序。只有在多个应用间需要共享数据的时候才需要ContentProvider。Android已经为常见的一些数据提供了默认的ContentProvider。
数据提供者
-
Provider
ContentProvider需要在AndroidManifest.xml中声明。说明 authorities ported adPermission itePermission 注: ContentProvider的authorities必须是唯一的,两个APP不能声明相同的authorities,否则安装时会报错INSTALL_FAILED_CONFLICTING_PROVIDER
-
ContentProvider
继承ContentProvider,实现需要实现的方法(onCreate,getType,insert,delete,update,query)。@Override public boolean onCreate() { mContext = getContext(); mUserDBHelper = new UserDBHelper(mContext); db = mUserDBHelper.getWritableDatabase(); mUriMatcher.addURI(AUTHORITIES, PATH, CODE); return true; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { if (isMatch(uri)) { return db.delete(UserDBHelper.TABLE_USER, selection, selectionArgs); } return 0; } @Override public String getType(Uri uri) { // at the given URI. return null; } @Override public Uri insert(Uri uri, ContentValues values) { if (isMatch(uri)) { long id = db.insert(UserDBHelper.TABLE_USER, null, values); return ContentUris.withAppendedId(uri, id); } return null; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { if (isMatch(uri)) { return db.query(UserDBHelper.TABLE_USER, projection, selection, selectionArgs, null, null, sortOrder); } return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { if (isMatch(uri)) { return db.update(UserDBHelper.TABLE_USER, values, selection, selectionArgs); } return 0; } /** * 是否是提供的数据访问 * @param uri * @return */ private boolean isMatch(Uri uri) { return CODE == mUriMatcher.match(uri); }
内容访问者
使用ContentResolver访问数据库,传入内容提供者的Uri。访问ContentProvider所在程序的时候会启动它的Application。
- 权限声明
根据需要在AndroidManifest.xml加入需要的读写权限。 - 数据操作
使用ContentResolver进行insert,delete,update,query操作getContentResolver().insert(uri, contentValues);getContentResolver().delete(mUri, "name like ?", new String[]{"visitor%"});getContentResolver().update(mUri, contentValues, "name like ?", new String[]{"visitor%"})getContentResolver().query(mUri, new String[]{"id", "name", "age", "address"}, null, null, null)
更多相关文章
- Android的数据存储
- [读书笔记]intent.putExtra的使用与原理分析
- Android(安卓)自定义Listview 如何绑定Sqlite数据库数据
- Android(安卓)开发中使用 SQLite 数据库
- 【Android】数据存储之Shared Preferences
- Android读写文件
- Android(安卓)APN的设置问题 默认“已起用数据” 关闭
- Android(安卓)sqlite 数据库操作
- mybatisplus的坑 insert标签insert into select无参数问题的解决