一、内容提供器部分(第一个项目)
在上篇博客的项目的基础上进行拓展,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文件中
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.t20.sqlite"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.t20.sqlite.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 注册内容提供器,指定提供器路径并指定主机名 -->
<provider
android:name="com.t20.provider.StudentProvider"
android:authorities="com.xxx.provider" >
</provider>
</application>
</manifest>
二、内容解析器部分(第二个项目)
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文件中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<!-- 查询全部信息 -->
<Button
android:id="@+id/btnInfo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:onClick="info"
android:text="获取信息" />
<EditText
android:id="@+id/etId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btnInfo"
android:layout_marginTop="37dp"
android:layout_toLeftOf="@+id/btnInfo"
android:ems="10" />
<!-- 按id查询信息 -->
<Button
android:id="@+id/btnInfoById"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/etId"
android:layout_toRightOf="@+id/etId"
android:text="按id查询信息"
android:onClick="infoById"/>
<!-- 根据id删除信息 -->
<Button
android:id="@+id/btnDeleteById"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/btnInfo"
android:layout_below="@+id/btnInfoById"
android:layout_marginTop="17dp"
android:text="根据id删除信息"
android:onClick="DeleteById"/>
<!-- 新增数据 -->
<Button
android:id="@+id/btnInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btnDeleteById"
android:layout_below="@+id/btnDeleteById"
android:layout_marginLeft="17dp"
android:layout_marginTop="28dp"
android:text="新增数据"
android:onClick="insert" />
</RelativeLayout>
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/");
}
}