当前位置:   article > 正文

Android --- ContentProvider 内容提供者

Android --- ContentProvider 内容提供者

理论知识

ContentProvider 是 Android中用于数据共享的机制,主要是用于进程间(App之间)。

如何进行数据共享

内容提供者 ContentProvider

提供数据,需要继承这个类,,并重写其中的增删改查方法。

继承 ContentProvider 类并重写增删改查、getType和 onCtreate方法,在新版的Android studio中新建一个ContentProvider会自动在 Mainifest中进行注册。

  • URI Authorities:相当于标识,通常由包名+provider组成 
  • Exported:是否对外暴露
  • Enabled:是否生效

 ContentProvider 中的方法

  • onCreate():该方法在ContentProvider创建后会被调用,当其他应用程序第一次访问ContentProvide时,该ContentProvider会被创建出来,并立即回调该onCreate方法
  • getType(Uri uri), 返回 当前Uri所代表的数据的MIME类型。如果该Uri对应数据可能包括多条记录,那么MIME类型字符串应该以 vnd.android.cursor.dir/开头;如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头。

内容观察者 ContentObserver

观察ContentProvider提供的数据,并通知 ContentResolver

内容接收者 ContentResolver

  • 处理数据,可以调用其类似数据库操作的增删改查方法,实现数据获取。
  • 它提供的方法与ContentProvider一一对应。
  • 但不同于sqlite数据库,它接收的不是表名而是一个url,这样可以保证数据的安全性。

什么是URI?

UriMatcher

UriMatcher本质是一个文本过滤器,可以直接得到Uri的path,可以通过调用uriMatcher.addURI()方法添加相对应的返回码

  1. private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  2. @Override
  3. public boolean onCreate() {
  4. dataBaseHelper = new DataBaseHelper(getContext());
  5. sqLiteDatabase = dataBaseHelper.getWritableDatabase();
  6. uriMatcher.addURI(AUTHORITIES, DataBaseHelper.STUTDY_SQLITE_TABLE, 0);
  7. return true;
  8. }
  9. @Override
  10. public String getType(Uri uri) {
  11. int code = uriMatcher.match(uri);
  12. if (code == 0) {
  13. return DataBaseHelper.STUTDY_SQLITE_TABLE;
  14. } else {
  15. return null;
  16. }
  17. }

实战演练

App-A ContentProvider

  1. package com.example.androidstudiostudy.contentprovider;
  2. import android.content.ContentProvider;
  3. import android.content.ContentValues;
  4. import android.content.UriMatcher;
  5. import android.database.Cursor;
  6. import android.database.sqlite.SQLiteDatabase;
  7. import android.net.Uri;
  8. import com.example.androidstudiostudy.database.DataBaseHelper;
  9. public class MyContentProvider extends ContentProvider {
  10. private UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
  11. private String AUTHORITIES = "com.example.androidstudiostydy.provider";
  12. private DataBaseHelper dataBaseHelper;
  13. private SQLiteDatabase sqLiteDatabase;
  14. public MyContentProvider() {
  15. }
  16. @Override
  17. public boolean onCreate() {
  18. dataBaseHelper = new DataBaseHelper(getContext());
  19. sqLiteDatabase = dataBaseHelper.getWritableDatabase();
  20. uriMatcher.addURI(AUTHORITIES, DataBaseHelper.STUTDY_SQLITE_TABLE, 0);
  21. return true;
  22. }
  23. @Override
  24. public String getType(Uri uri) {
  25. int code = uriMatcher.match(uri);
  26. if (code == 0) {
  27. return DataBaseHelper.STUTDY_SQLITE_TABLE;
  28. } else {
  29. return null;
  30. }
  31. }
  32. @Override
  33. public Cursor query(Uri uri, String[] projection, String selection,
  34. String[] selectionArgs, String sortOrder) {
  35. String tableName = getType(uri);
  36. if (tableName == null) {
  37. return null;
  38. }
  39. return sqLiteDatabase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder);
  40. }
  41. /// 删除
  42. @Override
  43. public int delete(Uri uri, String selection, String[] selectionArgs) {
  44. String tableName = getType(uri);
  45. // 查询的表不存在
  46. if (tableName == null) {
  47. return -1;
  48. }
  49. return sqLiteDatabase.delete(tableName, selection, selectionArgs);
  50. }
  51. /// 更新
  52. @Override
  53. public int update(Uri uri, ContentValues values, String selection,
  54. String[] selectionArgs) {
  55. String tableName = getType(uri);
  56. // 查询的表不存在
  57. if (tableName == null) {
  58. return -1;
  59. }
  60. return sqLiteDatabase.update(tableName, values, selection, selectionArgs);
  61. }
  62. @Override
  63. public Uri insert(Uri uri, ContentValues values) {
  64. String tableName = getType(uri);
  65. // 查询的表不存在
  66. if (tableName == null) {
  67. return null;
  68. }
  69. long index = sqLiteDatabase.insert(tableName, null, values);
  70. if (index > 0) {
  71. return uri;
  72. } else {
  73. return null;
  74. }
  75. }
  76. }

App-B ContentResolver

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5. getContentProviderData();
  6. }
  7. // 接收来自其他app的数据
  8. public void getContentProviderData() {
  9. ContentResolver contentResolver = getContentResolver();
  10. Uri uri = Uri.parse("content://com.example.androidstudiostydy.provider/STUTDY_SQLITE_TABLE");
  11. @SuppressLint("Recycle")
  12. // 检查 Cursor 是否为空
  13. Cursor cursor = contentResolver.query(uri, null, null, null, null);
  14. if (cursor != null) {
  15. while(cursor.moveToNext()){
  16. int id = cursor.getInt(0);
  17. String name = cursor.getString(1);
  18. String phone = cursor.getString(2);
  19. String pwd = cursor.getString(3);
  20. Log.d("contentprovider", id + "\t" + name + "\t" + phone + "\t" + pwd);
  21. }
  22. cursor.close();
  23. } else {
  24. Toast.makeText(this, "无法获取内容提供者数据", Toast.LENGTH_LONG).show();
  25. }
  26. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/882560
推荐阅读
相关标签
  

闽ICP备14008679号