一、内容提供器部分(第一个项目)
在上篇博客的项目的基础上进行拓展,BaseDao.java、StudentDaoImpl.java、Student.java以及MainActivity.java等文件不再重复追加
1、定义内容提供器
StudentProvider.java文件中
package com.t20.provider;
import com.t20.dao.BaseDao;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
/**
* 内容提供器
*
* @author Administrator
*
*/
public class StudentProvider extends ContentProvider {
// 定义一个静态的暗语
private static UriMatcher uriMatcher;
private static final int QUERY_ALL = 0;// 查询全部信息
private static final int QUERY_ID = 1;// 根据id查询信息
private static final int DELETE_ID = 2;// 删除
private static final int INSERT_ID = 3;// 新增
private static final int INSERT_ALL = 0;
private BaseDao baseDao;
// 在定义类对象时执行
static {
// 在创建时没有暗语
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 新增暗语,第一个参数是动作,第二个参数是表名(路径),QUERY_ALL查询全部
uriMatcher.addURI("com.xxx.provider", "student", QUERY_ALL);
// studentById/#中#是id的占位符
uriMatcher.addURI("com.xxx.provider", "studentById/#", QUERY_ID);
// 根据id删除信息
uriMatcher.addURI("com.xxx.provider", "deleteById/#", DELETE_ID);
//新增信息暗语
uriMatcher.addURI("com.xxx.provider", "insert", INSERT_ID);
}
@Override
public boolean onCreate() {
// TODO Auto-generated method stub
baseDao = new BaseDao(getContext());
return false;
}
/**
* 查询方法
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
SQLiteDatabase db = baseDao.getReadableDatabase();
Cursor cur = null;
switch (uriMatcher.match(uri)) {
// 查询全部信息
case QUERY_ALL:
// 第一个参数是要查询的表名, 第二个参数是要查询的列,null表示查询全部
cur = db.query("student", projection, selection, selectionArgs,
null, null, sortOrder);
break;
// 按id查询信息
case QUERY_ID:
// get(0)是studentById,get(1)是id
String id = uri.getPathSegments().get(1);
// 第一个参数是要查询的表名
cur = db.query("student", projection, "id=?", new String[] { id },
null, null, sortOrder);
break;
default:
break;
}
return cur;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
/**
* 新增方法
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
SQLiteDatabase db = baseDao.getReadableDatabase();
Uri uriReturn=null;
switch (uriMatcher.match(uri)) {
// 新增信息
case INSERT_ID:
case INSERT_ALL:
long newBookId=db.insert("student", null, values);
uriReturn=Uri.parse("content://com.xxx.provider/insert/");
break;
default:
break;
}
return uriReturn;
}
/**
* 删除方法
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
SQLiteDatabase db = baseDao.getReadableDatabase();
int rowCount = 0;
switch (uriMatcher.match(uri)) {
// 根据id删除信息
case DELETE_ID:
// get(0)是studentById,get(1)是id
String id = uri.getPathSegments().get(1);
// 方式一,在内容提供器设置参数
// rowCount = db.delete("student", "id=?", new String[] { id });
// 方式二,在解析器传值过来
rowCount = db.delete("student", selection, selectionArgs);
break;
default:
break;
}
return rowCount;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
}
}
2、注册内容提供器
AndroidManifest.xml文件中
二、内容解析器部分(第二个项目)
1、创建与数据库中对应的实体类
Student.java文件中
package com.t20.entity;
import java.io.Serializable;
public class Student implements Serializable {
private Integer id;
private String name;
private String sex;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student() {
super();
}
public Student(String name,String sex) {
super();
this.name = name;
this.sex = sex;
}
public Student(Integer id,String name,String sex) {
super();
this.id = id;
this.name = name;
this.sex = sex;
}
}
2、创建布局
activity_main.xml文件中
3.实现对应的方法
MainActivity.java文件中
package com.t20.dataReceiver;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
public class MainActivity extends Activity {
private EditText etId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etId = (EditText) findViewById(R.id.etId);
}
/**
* 查询全部信息
*
* @param v
*/
public void info(View v) {
// 获取内容解析器
ContentResolver resolver = getContentResolver();
// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
Uri uri = Uri.parse("content://com.xxx.provider/student");
// 调用查询方法返回游标,参数对应内容提供器的查询方法对应
Cursor cur = resolver.query(uri, null, null, null, null);
StringBuilder sb = new StringBuilder();
while (cur.moveToNext()) {
sb.append("id:" + cur.getInt(cur.getColumnIndex("id")) + "\t");
sb.append("name:" + cur.getString(cur.getColumnIndex("name"))
+ "\t");
sb.append("sex:" + cur.getString(cur.getColumnIndex("sex")) + "\n");
}
Toast.makeText(this, sb, Toast.LENGTH_SHORT).show();
cur.close();
}
/**
* 根据id查询信息
*
* @param v
*/
public void infoById(View v) {
// 获取内容解析器
ContentResolver resolver = getContentResolver();
// 获取到id
String id = etId.getText().toString();
// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
Uri uri = Uri.parse("content://com.xxx.provider/studentById/" + id);
// 调用查询方法返回游标,参数对应内容提供器的查询方法对应
Cursor cur = resolver.query(uri, null, null, null, null);
StringBuilder sb = new StringBuilder();
if (cur != null) {
while (cur.moveToNext()) {
sb.append("id:" + cur.getInt(cur.getColumnIndex("id")) + "\t");
sb.append("name:" + cur.getString(cur.getColumnIndex("name"))
+ "\t");
sb.append("sex:" + cur.getString(cur.getColumnIndex("sex"))
+ "\n");
}
Toast.makeText(this, sb, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "数据不存在!", Toast.LENGTH_SHORT).show();
}
if (cur != null) {
cur.close();
}
}
/**
* 根据id删除信息
*
* @param v
*/
public void DeleteById(View v) {
// 获取内容解析器
ContentResolver resolver = getContentResolver();
// 获取到id
String id = etId.getText().toString();
// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
Uri uri = Uri.parse("content://com.xxx.provider/deleteById/" + id);
// //方式一,在内容提供器设置参数
// int rowCount=resolver.delete(uri, null, null);
// //方式二,在解析器设置参数,传递到内容提供器中
int rowCount = resolver.delete(uri, "id=?", new String[] { id });
if (rowCount > 0) {
Toast.makeText(this, "删除成功!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败!", Toast.LENGTH_SHORT).show();
}
}
/**
* 新增数据
*/
public void insert(View v) {
// 获取内容解析器
ContentResolver resolver = getContentResolver();
// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
Uri uri = Uri.parse("content://com.xxx.provider/insert/");
}
}