移动开发课程-作业3
设计目标:
1、contentprovider是安卓四大组件之一,请使用其方法类进行数据获取;2、请自建一个provider,然后在另一个app中使用resolver调用这个provider。3、本次作业请启用新项目,理论上需要两个APP进行实验。
代码解析:
建立ContentProvider类,重写方法:
public class StuDbCP extends ContentProvider {
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH); //创建该内容提供者的匹配器
private static final String AUTHORITY = "cth.android.contentprovider.StuDbCP"; //定义授权信息,用于获取该内容提供者的标识
private static final String PATH = "student"; //路径,表示访问内容提供者的具体路径,一般用表明表示访问该数据库的具体哪张表
private static final int STU = 1; //设定标志位,STU表示单条信息
private static final int STUS = 2; //STUS表示多条信息
static{
URI_MATCHER.addURI(AUTHORITY, PATH + "/#", STU); //给匹配器加入匹配规则
URI_MATCHER.addURI(AUTHORITY, PATH, STUS);
}
private MyDBhelper stuDbHepler = null;
private SQLiteDatabase stuDb = null;
@Override
public boolean onCreate() {
boolean flag = false;
stuDbHepler = new MyDBhelper(getContext(),1); //创建SQLiteOpenHelper对象,版本为1
if(stuDb != null) flag = true;
return flag;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int flag = URI_MATCHER.match(uri); //匹配传入的Uri
Cursor selectResult = null;
SQLiteDatabase db = stuDbHepler.getReadableDatabase();
String whereClause = null;
switch(flag) {
case STU:
whereClause = "id = "+ ContentUris.parseId(uri); //如果匹配第一种方式表示后面跟了id,所以要先提取id
if(selection != null&& selection.equals("")) {
whereClause += " and "+ selection; //把id加到where条件子句(下面几种方法此步骤作用同理)
}
selectResult = db.query("student", projection, whereClause, selectionArgs, null, null, null);
break;
case STUS:
selectResult = db.query("student", projection,selection,selectionArgs, null, null, null);
}
return selectResult;
}
/*返回uri的路径扩展部分的信息,一般单个条目返回字段为vnd.android.cursor.item/对应的PATH 而多个条目的以vnd.android.cursor.dir/对应的PATH。*/
@Override
public String getType(Uri uri) {
int flag = URI_MATCHER.match(uri);
switch(flag) {
case STU:
return"vnd.android.cursor.item/student";
case STUS:
return "vnd.android.cursor.dir/students";
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int flag = URI_MATCHER.match(uri);
Uri resultUri = null;
switch(flag) {
case STUS :
stuDb = stuDbHepler.getWritableDatabase(); //获取写数据库
long id = stuDb.insert(PATH, null, values); //插入数据
resultUri = ContentUris.withAppendedId(uri, id); //建立插入的数据的URI
break;
}
return resultUri;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int flag = URI_MATCHER.match(uri);
String whereClause = null;
int rowCount = -1;
SQLiteDatabase db = stuDbHepler.getWritableDatabase();
switch(flag) {
case STU:
whereClause = "id = "+ ContentUris.parseId(uri);
if(selection != null&& selection.equals("")) {
whereClause += " and "+ selection ;
}
rowCount = db.delete("student", whereClause, selectionArgs);
break;
case STUS:
rowCount = db.delete("student", selection, selectionArgs);
default: break;
}
return rowCount;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int flag = URI_MATCHER.match(uri);
int count = -1;
SQLiteDatabase db = stuDbHepler.getWritableDatabase();
String whereClause = null;
switch(flag) {
case STU:
whereClause = "id = "+ ContentUris.parseId(uri);
if(selection != null&& selection.equals("")) {
whereClause += " and "+ selection ;
}
count = db.update("student", values, whereClause, selectionArgs);
break;
case STUS:
count = db.update("student", values, selection, selectionArgs);
break;
}
return count;
}
}
新建resolverlei,写入插入函数:
public void insertData() {
ContentResolver cr = getContext().getContentResolver();
Uri uri = Uri.parse("content://cth.android.contentprovider.StuDbCP/student");
ContentValues values = new ContentValues();
values.put("name", "李四");
values.put("age", 18);
Uri resultUri = cr.insert(uri, values);
if(resultUri != null) {
Log.i("cth",resultUri.toString());
} else{
Log.e("cth","插入失败");
}
}
运行展示截图:
点击button插入数据:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理