本文是针对ContentProvider基础用法的模拟:
ContentProvider主要是用于将数据库变为provider提供给第三方使用的控件
本文将创建一个数据库,一个第三方使用者来演示如何使用该组件。
具体步骤:
- 写一个内容提供者,继承自contentprovider
- 在mainfest中注册,并开启权限
- 校验URI的工具类和指定相关规则
- 以查询为例,写query方法
- 模拟一个第三方应用去调用数据库中的内容:
5.1、拿到一个contentResolver
5.2、根据uri来获得cursor
5.3、通过cursor来对数据库进行操作
————————————————————————————————————————————————
1、写一个contentProvider继承自ContentProvider:

2、在manifest中注册
四大组件都需要在manifest中进行注册
authority处一般来说填写的是包名,此处可以添加多个权限(但是后面的matcher中只能设置一个权限)
此处的exported表示其他应用也可读取的权限:

3、URI的校验方法
manifest中声明的provider中可以添加多个权限,但是此处只能放入一个参数!

注意!
规则中的path如果修改了,则在第三方应用中的URI也要添加上该path,这样才能通过校验(一般来说,path表示表名)


4、编写query方法
query方法根据权限来进行操作(如果匹配权限则进行query操作,如果不匹配则抛出异常)

5、模拟一个第三方应用
button设置点击事件,先拿到一个contentresolver,创建一个URI,拿到对方的cursor再进行query操作:


其他增删改查操作也都如此:
再以insert为例:
在第三方应用中设置button添加点击事件(点击按钮时插入数据)

在数据库中添加insert语句

第三方应用中创建内容观察者观察变化


ContentProvider中:
DAO接口:
public interface IUserDao {
/**
* 添加用户
* @param user
* @return
*/
long addUser(User user);
/**
* 删除用户
* @param
* @return
*/
int delUserById(int id);
/**
* 更新用户信息
* @param user
* @return
*/
int updateUser(User user);
/**
* 查询用户记录
* @param id
* @return
*/
User getUserById(int id);
/**
* 获取所有用户记录
* @param
* @return
*/
List<User> listAllUser();
}
DAO实现类:
public class UserDaoImpl implements IUserDao {
private final UserDatabaseHelper muserDatabaseHelper;
/**
* 构造方法,实例化数据库对象
* @param context
*/
public UserDaoImpl(Context context){
muserDatabaseHelper = new UserDatabaseHelper(context);
}
/**
* 插入user,db.insert的返回值是long类型的,返回的是行的ID,操作失败时返回-1
* @param user
* @return
*/
@Override
public long addUser(User user) {
SQLiteDatabase db=muserDatabaseHelper.getWritableDatabase();//获取数据库
ContentValues values=new ContentValues(); //键和键值的形式存入contextvalues中,ID是自动增长的故不用特地去设置
values.put(Constants.FILED_USER_NAME,user.getUserName());
values.put(Constants.FILED_USER_SEX,user.getSex());
values.put(Constants.FILED_PASSWORD,user.getPassword());
values.put(Constants.FILED_USER_AGE,user.getAge());
long result=db.insert(Constants.TABLE_NAME,null,values); //没有values就去创建一个contextvalues
db.close();
return result;
}
/**
* 删除user,根据ID删除,返回值也是一个int类型,返回的是删除的行数
*/
@Override
public int delUserById(int id) {
SQLiteDatabase db=muserDatabaseHelper.getWritableDatabase();//获取数据库
int result=db.delete(Constants.TABLE_NAME,Constants.FILED_ID+" =?",new String[]{
id + " "});
db.close();
return result;
}
/**
* 更新用户数据,根据id更新内容,返回值表示影响的行数
* @param user
* @return
*/
@Override
public int updateUser(User user) {
SQLiteDatabase db=muserDatabaseHelper.getWritableDatabase();//获取数据库
ContentValues values=new ContentValues();
values.put(Constants.FILED_USER_NAME,user.getUserName());
values.put(Constants.FILED_USER_SEX,user.getSex());
values.put(Constants.FILED_PASSWORD,user.getPassword(

本文详细讲解了Android ContentProvider的基础用法,包括创建ContentProvider、在manifest中注册、URI校验、实现query方法,以及模拟第三方应用如何通过ContentProvider访问数据库。通过示例展示了ContentProvider在数据库共享中的应用,包括查询、插入等操作。
最低0.47元/天 解锁文章
1763

被折叠的 条评论
为什么被折叠?



