Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android从零单排系列四十一】《Android数据存储方式-ContentProvider》

【Android从零单排系列四十一】《Android数据存储方式-ContentProvider》

作者头像
再见孙悟空_
发布于 2023-07-17 12:35:55
发布于 2023-07-17 12:35:55
32800
代码可运行
举报
运行总次数:0
代码可运行

前言

小伙伴们,在上文中我们介绍了Android数据存储中的SharedPreference,本文我们继续盘点介绍Android开发中的另一个数据存储方式ContentProvider。

一 ContentProvider基本介绍

ContentProvider是Android中的一个组件,用于在应用程序间共享数据。它可以封装底层的数据存储细节,并提供统一的接口来进行数据的读取、插入、更新和删除操作。通过ContentProvider,应用程序可以安全地访问其他应用程序的数据,实现了数据共享和交互。

二 ContentProvider使用方法

  1. 定义ContentProvider:首先,在你的应用程序中创建一个类,继承自ContentProvider。在该类中,你需要实现一些必要的方法,如onCreate()query()insert()update()delete(),以提供对数据的访问和操作。
  2. 注册ContentProvider:在AndroidManifest.xml文件中,将你的ContentProvider注册为一个组件。通过<provider>元素来配置ContentProvider的信息,包括名称、权限等。同时,也可以定义多个URI来定位不同类型的数据。
  3. 数据访问权限配置:如果需要限制其他应用程序对数据的访问,可以在AndroidManifest.xml文件中为ContentProvider声明相应的权限。
  4. 内容解析器操作:在客户端应用程序中,使用内容解析器(ContentResolver)来与ContentProvider进行交互。内容解析器提供了一套方法,如query()insert()update()delete(),用于查询、插入、更新和删除数据。
    • 查询数据:使用query()方法查询数据,指定要访问的URI、投影(即要返回的列)、选择条件、排序顺序等参数。该方法返回一个Cursor对象,可以通过该对象获取查询结果。
    • 插入数据:使用insert()方法向ContentProvider插入数据,指定要插入的URI和要插入的值。该方法返回一个表示新插入行的URI。
    • 更新数据:使用update()方法更新ContentProvider中的数据,指定要更新的URI、要更新的值以及选择条件。该方法返回受影响的行数。
    • 删除数据:使用delete()方法从ContentProvider中删除数据,指定要删除的URI和选择条件。该方法返回删除的行数。

三 ContentProvider常见属性及方法

常见属性(Attributes):

  1. android:authorities:用于在AndroidManifest.xml文件中指定ContentProvider的授权信息,标识ContentProvider提供数据的特定权限。
  2. android:exported:表示是否允许其他应用程序访问该ContentProvider。默认情况下为false,只有同一应用程序内的组件可以访问此ContentProvider。
  3. android:permission:指定访问ContentProvider所需的权限。通过定义适当的权限,可以对ContentProvider进行访问控制。

常见方法(Methods):

  1. onCreate():在创建ContentProvider时调用,通常用于执行初始化操作,如数据库的打开和连接等。
  2. query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):用于查询数据。参数包括要访问的URI、要返回的列(投影)、选择条件、选择参数和排序顺序。返回一个Cursor对象,可以使用它来获取查询结果。
  3. insert(Uri uri, ContentValues values):用于向ContentProvider插入数据。参数包括要插入的URI和要插入的值。返回一个表示新插入行的URI。
  4. update(Uri uri, ContentValues values, String selection, String[] selectionArgs):用于更新ContentProvider中的数据。参数包括要更新的URI、要更新的值和选择条件。返回受影响的行数。
  5. delete(Uri uri, String selection, String[] selectionArgs):用于从ContentProvider中删除数据。参数包括要删除的URI和选择条件。返回删除的行数。
  6. getType(Uri uri):用于获取指定URI的MIME类型。MIME类型用于描述数据的媒体类型,例如"image/jpeg"、"text/plain"等。
  7. 其他辅助方法:除了上述方法外,还可以根据需求实现其他自定义方法来完成特定的数据操作,这些方法可以直接在ContentProvider中定义和调用。

四 ContentProvider简单案例

创建ContentProvider类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyContentProvider extends ContentProvider {

    // 声明常量,用于定义URI和数据库表信息
    private static final String AUTHORITY = "com.example.mycontentprovider";
    private static final String TABLE_NAME = "mytable";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);

    // 数据库帮助类
    private DatabaseHelper dbHelper;

    @Override
    public boolean onCreate() {
        // 初始化数据库帮助类
        dbHelper = new DatabaseHelper(getContext());
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        // 查询数据
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
        if (cursor != null) {
            cursor.setNotificationUri(getContext().getContentResolver(), uri);
        }
        return cursor;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        // 获取MIME类型
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        // 插入数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        long id = db.insert(TABLE_NAME, null, values);
        getContext().getContentResolver().notifyChange(uri, null);
        return ContentUris.withAppendedId(CONTENT_URI, id);
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        // 删除数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int count = db.delete(TABLE_NAME, selection, selectionArgs);
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        // 更新数据
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int count = db.update(TABLE_NAME, values, selection, selectionArgs);
        getContext().getContentResolver().notifyChange(uri, null);
        return count;
    }
}

创建DatabaseHelper类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "mydatabase.db";
    private static final int DATABASE_VERSION = 1;
    private static final String CREATE_TABLE_SQL = "CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库升级操作
    }
}

注册ContentProvider: 在AndroidManifest.xml文件中添加如下代码,注册ContentProvider:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<provider
    android:name=".MyContentProvider"
    android:authorities="com.example.mycontentprovider" />

使用ContentProvider: 可以使用内容解析器(ContentResolver)来与ContentProvider进行交互,以下是一些示例代码:

查询数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String[] projection = {"_id", "name"};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;

Cursor cursor = getContentResolver().query(MyContentProvider.CONTENT_URI, projection, selection, selectionArgs, sortOrder);
if (cursor != null) {
	// 处理查询结果
    while (cursor.moveToNext()) {
        int idIndex = cursor.getColumnIndex("_id");
        int nameIndex = cursor.getColumnIndex("name");
        int id = cursor.getInt(idIndex);
        String name = cursor.getString(nameIndex);
        // 打印数据
        Log.d("MyContentProvider", "id: " + id + ", name: " + name);
    }
    cursor.close();
}

插入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ContentValues values = new ContentValues();
values.put("name", "John");

Uri uri = getContentResolver().insert(MyContentProvider.CONTENT_URI, values);

更新数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ContentValues values = new ContentValues();
values.put("name", "Michael");

String selection = "_id=?";
String[] selectionArgs = {"1"};

int count = getContentResolver().update(MyContentProvider.CONTENT_URI, values, selection, selectionArgs);

删除数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String selection = "_id=?";
String[] selectionArgs = {"1"};

int count = getContentResolver().delete(MyContentProvider.CONTENT_URI, selection, selectionArgs);

通过这个简单的ContentProvider案例,你可以了解到创建、注册和使用ContentProvider的基本步骤。

五 总结

  1. 数据共享:ContentProvider提供了一种有效的方式来共享数据,使得不同的应用程序可以访问和操作相同的数据集。这样可以提高应用之间的互操作性和数据共享的灵活性。
  2. 数据安全性:ContentProvider具有权限控制机制,可以限制其他应用对数据的访问权限。这样可以确保敏感数据不被未经授权的应用程序获取,提高数据的安全性。
  3. 数据管理:ContentProvider提供了CRUD(创建、读取、更新、删除)操作的接口,可进行数据的增删改查操作。这样可以方便地管理和维护数据集。
  4. 效率和性能:通过ContentResolver和ContentProvider进行数据交互,可以避免直接操作数据库或文件系统,从而提高数据访问的效率和性能。
  5. 学习曲线:使用ContentProvider需要掌握相关的API和概念,对开发者来说可能存在一定的学习曲线。但一旦掌握了ContentProvider的使用方法,可以极大地提升应用程序的功能和灵活性。
  6. 可维护性:使用ContentProvider可以将数据管理的逻辑与UI层分离,使得代码结构更清晰、可维护性更高。这对于大型应用程序和团队协作开发非常重要。

总体而言,ContentProvider是Android中一个功能强大且重要的组件,它提供了一种标准化的方式来实现不同应用之间的数据共享和访问。合理利用ContentProvider能够增加应用的灵活性、安全性和可维护性,从而提升用户体验和开发效率。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android四大组件之ContentProvider
Hi,大家好,我们又双叒叕见面啦,为了让大家快速的学习Android知识,我们每天都在更新文章,相信小伙伴们已经开始眼熟我们了!这一期我们讲解ContentProvider(内容提供者)相关知识,他也是我们近期更新的Android四大组件中最后一个。话不多说,让我们赶紧开始学习吧~
下码看花
2019/09/02
6650
Android四大组件之ContentProvider
Android 四大组件学习之ContentProvider二
上节学习了什么是ContentProvider,以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider
DragonKingZhu
2022/05/08
1700
Android 四大组件学习之ContentProvider二
安卓开发_深入理解Content Provider
一、Content Provider概述 Content Provider用于保存和获取数据,并使其对所有应用程序可见,这是不同应用程序之间共享数据的唯一方式,因为在Android中没有提供所有应用可以共同访问的公共存储区域 1、  Content Provider内部的数据如何保存是由其设计者决定的,而所有的的Content Provider都实现一组通用的方法,用来提供数据的增删改查操作 2、  客户端如果要使用这些操作方法,可以通过ContentProvider对象实现对 Content Provid
听着music睡
2018/05/18
7350
Android 进阶11:进程通信之 ContentProvider 内容提供者
学习启舰大神,每篇文章写一句励志的话,与大家共勉。 When you are content to be simply yourself and don’t compare or compete,
张拭心 shixinzhang
2018/01/05
2.7K0
Android 进阶11:进程通信之 ContentProvider 内容提供者
Content Provider 之 最终弹 实战体验跨程序数据共享(结合SQLiteDemo)
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下:
凌川江雪
2018/09/13
4350
Content Provider 之 最终弹   实战体验跨程序数据共享(结合SQLiteDemo)
Android四大组件之ContentProvider
Android四大组件之ContentProvider ContentProvider 安卓应用程序默认是无法获取到其他程序的数据,这是安卓安全学的基石(沙盒原理)。但是经常我们需要给其他应用
xiangzhihong
2018/01/26
1K0
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
在Android中有些数据(如通讯录、音频、视频文件等)是要供非常多应用程序使用的。为了更好地对外提供数据,Android系统给我们提供了Content Provider使用,通过它能够訪问上面所说的数据。比如非常多音乐播放器中的扫描功能事实上就用到了Content Provider功能(当然,也有的播放器是自己去实现更底层的功能)。
全栈程序员站长
2022/07/07
7870
Android中的跨进程通信方法实例及特点分析(二):ContentProvider
ContentProvider
构建content URI public class TaskContract { /* COMPLETED (1) Add content provider constants to the Contract Clients need to know how to access the task data, and it's your job to provide these content URI's for the path to that data:
acc8226
2022/05/17
2360
ContentProvider
Android必知必会的四大组件--ContentProvider
作为四大组件之一,它的地位绝对不容许轻视的。但是我们在哪里有用到过他呢?其实很多场景都有,比如说你在使用app时,是不是经常的会询问你是否开启通讯录的访问,如果你同意了,这个时候ContentProvider就发挥了他的作用。
ClericYi
2020/06/23
5520
Android基础总结(6)——内容提供器
  前面学习的数据持久化技术包括文件存储、SharedPreferences存储以及数据库存储技术保存的数据都只能被当前应用程序所访问。虽然文件存储和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种操作模式,可以实现不同应用程序间的数据共享,但是这两种模式在Android4.2版本中就已经被废弃了。目前,Android系统推荐使用一种更加安全可靠的内容提供器技术。 内容提供器(Content Provider)主要用于在不
mukekeheart
2018/02/27
1.2K0
【Android开发基础系列】数据持久化专题
http://blog.csdn.net/wulianghuan/article/details/8501063
江中散人_Jun
2023/10/16
5440
【Android开发基础系列】数据持久化专题
Android:关于ContentProvider的知识都在这里了!
4.2.2 MIME类型组成 每种MIME类型 由2部分组成 = 类型 + 子类型
Carson.Ho
2019/02/22
2.5K0
Android 第三次作业 contentprovider与resolver
1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;
张浪
2022/11/24
4560
Android数据存储实现的5大方式
第一种: 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity
用户2192970
2019/02/21
3.6K0
Android数据存储实现的5大方式
Android ContentProvider_1 使用方法
ContentProvider 是进程间内容共享的统一接口。注意:ContentProvider 的作用不是实现进程间通信,它只是为进程间通信提供了一套统一接口,真正实现进程间通信的是底层的 Binder 机制。
大公爵
2022/11/07
7210
Android ContentProvider_1 使用方法
Android中ContentProvider简介
翻看Android源码可以发现,Android一般的代码架构如下:activity,service,receiver----contentProvider------db(file) 也就是说创建数据库保存数据,借助contentprovider对数据进行增删该查,上层利用Android组件进行交互。于是想着给自己新写的项目也添加个contentProvider来学习Android谷歌工程师的高大上,但从未用过contentprovider,这是第一次用,用完之后就发现一个问题 第一,contentprov
fanfan
2018/01/24
7440
Android进程间通信(五):进程间通信的方式之ContentProvider
前面我们介绍了: 进程间通信基础介绍 通过AIDL介绍Binder的工作机制 通过 Bundle、文件共享、Messenger实现进程间通信 进程间通信的方式之AIDL
103style
2022/12/19
6600
Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
当我们完成了对数据库的操作后,记得调用SQLiteDatabase的close()方法释放数据库连接,否则容易出现SQLiteException。
Carson.Ho
2019/02/22
31.2K3
ContentProvider
ContentProvider 内容提供者,应用程序间的数据交互,是为存储和获取数据提供的统一接口。 Contentprovider为应用间数据交互提供了安全的环境,它允许把自己的应用数据开放给其他应用进行 CRUD。怎么样进行操作可以自己规定,不用担心权限的问题。 当然如果不想被被人读取自己应用的数据就不需要这个内容提供者。 ContentResolver来访问和操作我们的数据。 ContentResolver 通过我们注册的uri就可以找到我们开放的数据。 关于uri 参考这篇文章:http://b
佛系编码
2018/05/22
6820
Android ContentProvider实例详解
ContentProvider(内容提供者)是Android的四大组件之一,管理android以结构化方式存放的数据,以相对安全的方式封装数据(表)并且提供简易的处理机制和统一的访问接口供其他程序调用。  Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,就会用到ContentProvider。而且Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
Android技术干货分享
2019/05/07
2.5K0
Android ContentProvider实例详解
相关推荐
Android四大组件之ContentProvider
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档