啥是ContentProvider
内容提供者(Content Provider)主要用于在不同的应用之间实现数据共享的功能,他提供了一整套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。目前内容提供者是Android实现跨平台共享数据的标准方式。
- ContentProvider=中间者角色(搬运工),真正存储&操作数据的数据源还是原来存储数据的方式(数据库、文件、xml或者网络)
不同于文件存储和SharedPreferences存储中的两种全局可读可写操作模式,内容提供者可以选择只对那一部分内容进行共享,从而保证程序的隐私数据不会泄露的风险。
uri:指定查询某一个程序的某一张表
projection:指定查询的列名
selection:指定查询条件,相当于sql语句中的where后面的条件
selectionArgs:给selection中的占位符提供具体的值
orderBy:指定查询结果排序方式
cancellationSignal:取消正在操作的信号量
想要访问内容提供者中共享的数据,就一定要借助ContentResolver类,可以通过Context中的getContentResolver()的方法获取的该类的实例,ContentResolver中提供了一系列的方法用于对数据进行CRUD(增删改查)的操作,其中insert()方法用于添加数据,update()方法用于数据的更新
和SQLite数据库差不多。
但是不同于SQLiteDatabase,ContentResolver中的增删改查方法都是不接受表明参数的,而是使用一个uri参数替代,这个参数被称为内容URI。内容URI给内容提供者中的数据建立了唯一的标识符,主要由两个部分组成:authority和path。authority是用于对不同的应用程序做区分,一般为了避免冲突,都会采用程序包命名的方式来命名。比如某个程序包名为com.example.app,那就写成com.example.app.provider。path则是用来对同一应用程序中不同的表做区分,通常都会加在authority的后面。
创建自己的ContentProvider
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
/**
* 大便提供者,主职:提供大便
*/
public class ShitProvider extends ContentProvider {
@Override
public boolean onCreate() {
/**
* onCreate()方法:
* 初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作。返回true表示内容提供者初始化成功,返回false则表示失败。
* 只有当存在ContentResolver尝试访问我们的程序中的数据时,内容才会被初始化
*/
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
/**
* 从内容提供者中查询数据,使用的uri参数来确定查询的哪张表,projection参数用于确定查询哪一个列
* selection和selectionArgs参数用于约束查询哪些行
* sortOrder参数用来对结果进行排序,查询的结果存放在Cursor对象中返回
*/
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
/**
*
*/
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
}
统一资源表示符uri
- 定义:Uniform Resource Identifier,统一资源标识符(URI)
- 作用:统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。唯一标识Contentprovider其中的数据
- 具体使用:URI分为系统预置和自定义,分别对应了如通讯录、日程表和自定义数据库
MIME数据类型
定义: 多功能邮件扩充服务,MIME类型就是定义了某种扩展名的文件用一种应用程序来打开的方式,就像发送的word用office打开一样,多用于指定一些客户端自定义的文件名。
作用:指定某个扩展名的文件用某种应用程序来打开。
ContentProvider
数据组织方式:ContentProvider主要以表格的方式组织数据,每个表格包含列和行,分别对应记录和字段
主要方法:进程间共享数据的本质是:添加、删除和获取修改数据