前言
之前只知道ContentProvider是Android进程间通信的一种方式,最近才做了一个具体的学习,特此记录
ContentProvider也是AndroidIPC的一种很重要的方式,和Messenger一样,天生就适合进程间通信。同样的,它使用起来也比AIDL要简单很多,因为都是对Binder做了一层封装。
1.概念理解
使用ContentProvider,其实是提供了一套标准的数据操作接口给外界。外界可以通过这一整套接口(具体就是实现CRUD的功能的接口),实现数据之间的共享,从而实现进程间通信。至于具体操作的数据源是什么,比如是本地数据库,还是文件,还是网络获取,外界并不需要关心,这是ContentProvider内部的事情。
2.具体使用
①创建Book实体类
/**
* Created by didiwei on 2022/5/15
* desc: Book实体类
*/
public class Book {
int bookId;
String bookName;
public Book(){
}
public Book(int bookId, String bookName) {
this.bookId = bookId;
this.bookName = bookName;
}
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Override
public String toString() {
return "Book{" +
"bookId=" + bookId +
", bookName='" + bookName + '\'' +
'}';
}
}
②创建数据库,作为ContentProvider操作的数据来源
/**
* Created by didiwei on 2022/5/15
* desc: 数据库
*/
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;//数据库版本号
private static final String DB_NAME = "book_provider.db";//数据库名称
public static final String BOOK_TABLE_NAME = "book";//book表
public static final String USER_TABLE_NAME = "user";//user表
//创建book表和user表
private String CREATE_BOOK_TABLE = "create table if not exists "+ BOOK_TABLE_NAME +
"(_id integer primary key," + "name text)";
private String CREATE_USER_TABLE = "create table if not exists " + USER_TABLE_NAME +
"(_id integer primary key," + "name text," + "sex int)";
//创建默认构造方法
public DatabaseHelper(Context context){
super(context,DB_NAME,null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建book表和user表
db.execSQL(CREATE_BOOK_TABLE);
db.execSQL(CREATE_USER_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
③创建ContentProvider,即BookProvider
同时让它运行在一个独立的进程中
其中,
(1)authorities
是ContentProvider的唯一标识。
(2)外界应用如果想访问BookProvider,就必须声明android:permission="com.example.PROVIDER"
这个权限
/**
* todo query 参数相对应的 sql语句
*
* String[] projection = {
* ContactsContract.Contacts._ID,
* ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
* ContactsContract.CommonDataKinds.Phone.NUMBER
* };
*
* String selectionClause = ContactsContract.CommonDataKinds.Phone.NUMBER + " &