Android 中自定义 ContentProvider 与 ContentObserver 的使用简单实例 Android 中的 ContentProvider 是一种机制,允许不同的应用程序之间共享数据。 ContentProvider 主要用于提供数据给其他应用程序使用。今天,我们将通过一个简单的示例来演示如何自定义 ContentProvider 和使用 ContentObserver 监听数据变化。 自定义 ContentProvider 的实现 首先,我们需要在 AndroidManifest.xml 文件中注册我们的 ContentProvider。注册时需要添加 android:exported="true" 属性,以允许其他应用程序访问我们的 ContentProvider。 ```xml <provider android:name=".ContentProviderTest" android:authorities="cn.bs.testcontentprovider" android:exported="true" /> ``` 在我们的 ContentProvider 中,我们需要重写以下几个方法: * `onCreate()`:在 ContentProvider 创建时调用。 * `query()`:用于查询数据。 * `insert()`:用于插入数据。 * `update()`:用于更新数据。 * `delete()`:用于删除数据。 下面是我们的 ContentProvider 的实现: ```java public class ContentProviderTest extends ContentProvider { private SQLiteDatabase database; @Override public boolean onCreate() { database = new DatabaseHelper(getContext()).getWritableDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return database.query(getTableName(uri), projection, selection, selectionArgs, null, null, sortOrder); } @Override public Uri insert(Uri uri, ContentValues values) { long rowId = database.insert(getTableName(uri), null, values); return Uri.parse(uri + "/" + rowId); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return database.update(getTableName(uri), values, selection, selectionArgs); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return database.delete(getTableName(uri), selection, selectionArgs); } private String getTableName(Uri uri) { // 根据 Uri 获取表名 } } ``` 使用 ContentObserver 监听数据变化 在我们的测试应用程序中,我们可以使用 ContentObserver 监听自定义 ContentProvider 的数据变化。首先,我们需要在我们的 Activity 中注册 ContentObserver: ```java public class MainActivity extends AppCompatActivity { private ContentObserver observer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); observer = new MyContentObserver(new Handler()); getContentResolver().registerContentObserver(Uri.parse("content://cn.bs.testcontentprovider/person"), true, observer); } @Override protected void onDestroy() { super.onDestroy(); getContentResolver().unregisterContentObserver(observer); } private class MyContentObserver extends ContentObserver { public MyContentObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // 数据变化时执行的操作 } } } ``` 在上面的代码中,我们使用 `getContentResolver().registerContentObserver()` 方法注册了 ContentObserver,並指定了要监听的 Uri 和变化时执行的操作。 Uri 中的通配符 在 Uri 中,我们可以使用通配符来匹配不同的表名或数据。例如: * `content://cn.bs.testcontentprovider/*`:匹配所有表的 Uri。 * `content://cn.bs.testcontentprovider/person/#`:匹配 person 表中任意一行的 Uri。 UriMatcher 的使用 UriMatcher 是一个工具类,用于匹配 Uri。我们可以使用 UriMatcher 来匹配不同的 Uri,并执行相应的操作。 ```java public class ContentProviderTest extends ContentProvider { private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { uriMatcher.addURI("cn.bs.testcontentprovider", "person", 1); uriMatcher.addURI("cn.bs.testcontentprovider", "person/#", 2); } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int match = uriMatcher.match(uri); switch (match) { case 1: // 匹配 person 表 break; case 2: // 匹配 person 表中任意一行 break; default: throw new IllegalArgumentException("Unknown Uri: " + uri); } } } ``` 自定义 ContentProvider 和使用 ContentObserver 监听数据变化是 Android 中非常重要的机制,能够让不同的应用程序之间共享数据。
- 粉丝: 3
- 资源: 903
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展