跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
ContentProvider
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= ContentProvider = '''ContentProvider'''是Android平台中的一个核心组件,它提供了一种标准化的接口,用于在不同应用程序之间共享数据。作为Android四大组件之一(其他三个是[[Activity]]、[[Service]]和[[BroadcastReceiver]]),ContentProvider封装数据并通过统一的[[URI]]机制提供访问权限控制。 == 基本概念 == ContentProvider的主要特点包括: * 提供跨应用数据共享的安全机制 * 使用URI(统一资源标识符)作为数据标识 * 实现标准的数据访问接口(CRUD操作) * 支持数据变更通知机制 == 架构与工作原理 == ContentProvider工作在客户端-服务器模式下: 1. '''提供者应用''':实现ContentProvider的子类并声明在清单文件中 2. '''客户端应用''':通过[[ContentResolver]]与提供者交互 <mermaid> graph LR A[客户端应用] -->|ContentResolver| B[ContentProvider] B --> C[(数据库/文件/网络)] </mermaid> == 核心方法 == ContentProvider类包含以下关键方法: <syntaxhighlight lang="java"> public class MyProvider extends ContentProvider { // 初始化Provider @Override public boolean onCreate() { ... } // 查询数据 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { ... } // 插入数据 @Override public Uri insert(Uri uri, ContentValues values) { ... } // 更新数据 @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { ... } // 删除数据 @Override public int delete(Uri uri, String selection, String[] selectionArgs) { ... } // 返回MIME类型 @Override public String getType(Uri uri) { ... } } </syntaxhighlight> == URI格式 == ContentProvider使用特定格式的URI来标识数据: <pre> content://<authority>/<path>/<id> </pre> 示例: * content://com.example.provider/contacts - 所有联系人 * content://com.example.provider/contacts/1 - ID为1的联系人 == 实际应用示例 == === 1. 实现简单的ContentProvider === <syntaxhighlight lang="java"> public class BookProvider extends ContentProvider { private SQLiteDatabase mDb; @Override public boolean onCreate() { BookDatabaseHelper helper = new BookDatabaseHelper(getContext()); mDb = helper.getWritableDatabase(); return mDb != null; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return mDb.query("books", projection, selection, selectionArgs, null, null, sortOrder); } // 其他方法实现... } </syntaxhighlight> === 2. 在AndroidManifest.xml中声明 === <syntaxhighlight lang="xml"> <provider android:name=".BookProvider" android:authorities="com.example.bookprovider" android:exported="true" /> </syntaxhighlight> === 3. 客户端访问示例 === <syntaxhighlight lang="java"> // 查询所有书籍 Cursor cursor = getContentResolver().query( Uri.parse("content://com.example.bookprovider/books"), null, null, null, null); // 插入新书籍 ContentValues values = new ContentValues(); values.put("title", "Android开发指南"); values.put("author", "张三"); getContentResolver().insert( Uri.parse("content://com.example.bookprovider/books"), values); </syntaxhighlight> == 高级特性 == === 数据变更通知 === ContentProvider可以通过ContentResolver.notifyChange()方法通知注册的观察者数据已变更: <syntaxhighlight lang="java"> getContext().getContentResolver().notifyChange(uri, null); </syntaxhighlight> 客户端可以注册ContentObserver来监听变化: <syntaxhighlight lang="java"> getContentResolver().registerContentObserver( uri, true, new MyObserver()); </syntaxhighlight> === 批量操作 === Android支持通过ContentProviderOperation进行批量操作: <syntaxhighlight lang="java"> ArrayList<ContentProviderOperation> ops = new ArrayList<>(); ops.add(ContentProviderOperation.newInsert(uri) .withValue("title", "新书") .build()); getContentResolver().applyBatch(authority, ops); </syntaxhighlight> == 安全考虑 == * 通过android:permission属性声明所需权限 * 使用android:readPermission和android:writePermission分别控制读写权限 * 对于敏感数据,设置android:exported="false"限制外部访问 == 常见系统ContentProvider == Android系统提供了多个内置ContentProvider: * ContactsContract - 联系人数据 * CalendarContract - 日历数据 * MediaStore - 多媒体文件 * Settings - 系统设置 == 性能优化建议 == 1. 使用数据库索引优化查询性能 2. 对于大数据集,实现分页查询 3. 合理使用批量操作减少IPC调用 4. 考虑使用CursorLoader在后台线程加载数据 == 参见 == * [[ContentResolver]] - ContentProvider的客户端接口 * [[Cursor]] - 查询结果容器 * [[Uri]] - 统一资源标识符 * [[SQLiteDatabase]] - Android内置数据库 [[Category:Android组件]] [[Category:Java编程]] [[Category:数据访问层]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)