移动开发课程-作业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插入数据:

 

 

 

 

 

posted @ 2022-11-24 17:00  程序员-黑虎阿福  阅读(29)  评论(0编辑  收藏  举报