----------------------------------------------------------------------------UserProvider ---------------------------------------------------------------------------------------------
package com.newer.cp.demo;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import com.newer.cp.entity.User;
//BaseDAO
public class UserProvider extends ContentProvider {
private static final UriMatcher uriMatcher;
private SQLiteDatabase sd = null;
private static final int MULTIPLE_USER = 1;
private static final int SINGLE_USER = 2;
//一、完成另一个应用程序传入Uri的解析
//用户当前需要操作数据的方式
static{
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//查找一条记录 //CONTENT:// AUTHORITY/多条记录操作方式
uriMatcher.addURI(User.AUTHORITY, User.PATH_MULTIPLE, MULTIPLE_USER);//1
//查找多条记录
uriMatcher.addURI(User.AUTHORITY, User.PATH_SINGLE, SINGLE_USER);//2
}
//获取用户操作数据的类型Uri uri
//单条记录
//多条记录
//由UriMatcher(Uri匹配)
//对用户传入的Uri进行解析
//获取用户操作数据的类型
@Override
public String getType(Uri uri) {
//match(uri)
//对传入的Uri进行解析
//获取操作的类型
switch(uriMatcher.match(uri)){
case MULTIPLE_USER://1
//操作数据的类型
return User.MINE_TYPE_MULTIPLE;
case SINGLE_USER:
return User.MINE_TYPE_SINGLE;
default:
throw new IllegalArgumentException("Unkown uri:"+uri);
}
}
//二、同样通过SqliteOpenHelpe完成数据库建立操作
//重写的onCreate方法中完成数据库的建立
class MyDataHelper extends SQLiteOpenHelper{
String sql = "create table user (_id integer primary key autoincrement, " +
"name text not null, age integer, height float);";
public MyDataHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists user");
onCreate(db);
}
}
//等同于UserDAO-->createDataBase()//提供SqliteOpenHelper的实例化
@Override
public boolean onCreate() {
Context ctxt = UserProvider.this.getContext();
MyDataHelper mdh = new MyDataHelper(ctxt, "usernewer.db", null, 1);//如果修改了数字1,onUpgrade
//创建数据库
//SqliteDataBase sd-->usernewer数据库
sd = mdh.getWritableDatabase();
if (sd == null) {
return false;
}else
{
return true;
}
}
//添加数据
//三、重写四大方法,完成表的添/删/改/查
@Override
public Uri insert
(Uri uri, ContentValues values) {
long id = sd.insert("user", null, values);
//如何加入新增记录的编号
//id > 0:新增记录成功
if (id > 0) {
//将编号附加到Uri中
//content://com.newer.userprovider/user/2
Uri newUserUri =ContentUris.withAppendedId(User.CONTENT_URI, id);
//ContentResolver-->ContentProvider
//notifyChange:通知改变
//通知另一个使用ContentProvider的应用
//程序,当前表中的记录发生了改变
UserProvider.this.getContext().getContentResolver().notifyChange(newUserUri, null);
return newUserUri;
} else {
throw new SQLException
("Failed to insert row into " + uri);
}
}
//修改
//PrepareStatement
// int update:返回的int类型值指修改记录总数
//update user set name="一般用户" where _id < 25
@Override
public int update(Uri uri, //传入的是由用户应用程序发出的ContentResolver.update(Uri, ContentValues)
ContentValues values, String selection, //where id < ?
String[] selectionArgs) {//new String[]{""}
int count = 0;
//一、判断当前用户请求数据的操作类型
//二、完成修改数据的操作
switch (uriMatcher.match(uri)) {
//content://com.newer.userprovider/user/1(EditText)
case MULTIPLE_USER:
/**
* select
* from
* where _id=?
* having
* group by
* order by
*/
//ContentResolver.update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
//ContentProvider.update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
//sd(SqliteDataBase).update(Uri,ContentValues, "where _id < ?", new String[]{"25"})
sd.update("user", values, selection, selectionArgs);
break;
case SINGLE_USER:
//content://com.newer.userprovider/user/1
//content://com.newer.userprovider/user-->get(0)
//仅仅获取编号-->get(1)
//String.subString(index,index)
String segment = uri.getPathSegments().get(1);
count = sd.update("user", values, User.KEY_ID+"=" + segment, //SqliteDatabase.update("user", updateValues, "_id" + "=" + id, null)
selectionArgs);
break;
}
//三、刷新ContentResolver数据发生了变化
UserProvider.this.getContext().getContentResolver().notifyChange(uri, null);
return count;
}
//删除
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
//一、判断当前用户请求数据的操作类型
//二、完成修改数据的操作
//三、刷新ContentResolver数据发生了变化
//删除记录的总数
int count = 0;
switch(uriMatcher.match(uri)){
case MULTIPLE_USER:
count = sd.delete("user", selection, selectionArgs);
break;
case SINGLE_USER:
String segment = uri.getPathSegments().get(1);
count = sd.delete("user", User.KEY_ID + "=" + segment, selectionArgs);
break;
default:
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return count;
}
//查询数据
//findUserById()
@Override
public Cursor query(Uri uri,
String[] projection, //字段
String selection,//where _id = ?
String[] selectionArgs, //?的值
String sortOrder) {//ASC/DESC: 排序
//一、构建SqliteQueryBuilder完成 //Sql查询的建立 //select * from user
SQLiteQueryBuilder sqb = new SQLiteQueryBuilder();
//from user
sqb.setTables("user");
//二、根据用户Uri进行查询类型选择查询指定编号记录
switch(uriMatcher.match(uri)){
//查询指定编号记录
case SINGLE_USER:
//content://com.newer.userprovider
///user/3
String segment = uri.getPathSegments().get(1);//3
//where _id = 3
sqb.appendWhere(User.KEY_ID + "=" + segment);
break;
default:
break;
}
//查询单条/多条
//SqliteDataBase.query()
Cursor cursor = sqb.query(sd,projection, selection, selectionArgs, null, null, sortOrder);
//三、通知ContentResovler数据,查询得到的游标集合
cursor.setNotificationUri(this.getContext().getContentResolver(), uri);
return cursor;
}
}
----------------------------------------------------------------------------User ---------------------------------------------------------------------------------------------
package com.newer.cp.entity;
import android.net.Uri;
//实体类
public class User {
//常量
//一、指定ContentProvider操作数据类型
//查找ContentProvider数据源的固定路径
//多条记录
public static final String MIME_DIR_PREFIX = "vnd.android.cursor.dir";
//单条记录
public static final String MIME_ITEM_PREFIX = "vnd.android.cursor.item";
public static final String MINE_ITEM = "vnd.newer.user";
//二、提供用户(另一个应用程序)使用的URI必须在主配置文件AndroidManifest.xml中注册
//www.sohu.com/index.html
//vnd.android.cursor.item/vnd.newer.user
public static final String MINE_TYPE_SINGLE = MIME_ITEM_PREFIX + "/" + MINE_ITEM;
public static final String MINE_TYPE_MULTIPLE = MIME_DIR_PREFIX + "/" + MINE_ITEM;
public static final String AUTHORITY = "com.ws.userprovider111";
public static final String PATH_SINGLE = "user/#";//user/#-->user/1-->第一条记录 //单条
public static final String PATH_MULTIPLE = "user";//user-->select * from user //多条
//Uri
//协议://路径
//newer:// AUTHORITY/多条记录操作方式
public static final String CONTENT_URI_STRING = "content://" + AUTHORITY + "/" + PATH_MULTIPLE;
public static final Uri CONTENT_URI = Uri.parse(CONTENT_URI_STRING);
//三、字段名称(String)
//字段
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_AGE = "age";
public static final String KEY_HEIGHT = "height";
}
----------------------------------------------------------------------------MainActivity ---------------------------------------------------------------------------------------------
package com.newer.cp.ui;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.newer.cp.entity.User;
public class MainActivity extends Activity {
private EditText nameText;
private EditText ageText;
private EditText heightText;
private EditText idEntry;
private TextView labelView;
private TextView displayView;
//清除显示
private Button clearButton = null;
//添加一条记录
private Button addButton = null;
//修改指定编号的记录
private Button updateButton = null;
//删除指定编号的记录
private Button deleteButton = null;
//删除所有记录
private Button deleteAllButton = null;
//查询指定编号记录
private Button queryButton = null;
//查询全部记录
private Button queryAllButton = null;
//共享ContentProvider提供的数据
//一、通过Activity获取ContentResolver
ContentResolver contentResolver = null;
/** *******************************************************/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nameText = (EditText)findViewById(R.id.name);
ageText = (EditText)findViewById(R.id.age);
heightText = (EditText)findViewById(R.id.height);
idEntry = (EditText)findViewById(R.id.id_entry);
labelView = (TextView)findViewById(R.id.label);
displayView = (TextView)findViewById(R.id.display);
contentResolver = this.getContentResolver();
clearButton = (Button)findViewById(R.id.clear);
//清除显示
clearButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//清除TextView(@+id/display)中的字符
displayView.setText("");
}
});
//添加一条记录
addButton =
(Button)findViewById(R.id.add);
addButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//二、添加数据--〉ContentValues
ContentValues values = new ContentValues();
values.put(User.KEY_NAME, nameText.getText().toString());
values.put(User.KEY_AGE, Integer.parseInt(ageText.getText().toString()));
values.put(User.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString()));
/**
* ContentProvider
* public Uri insert(Uri uri, ContentValues values)
*/
//content://com.newer.userprovider
Uri newUri = contentResolver.insert(User.CONTENT_URI, values);
labelView.setText("添加成功,URI:" + newUri);
}
});
//修改指定编号的记录
updateButton = (Button)findViewById(R.id.update);
updateButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//一、接收用户输入的数据封装成ContentValues
ContentValues values = new ContentValues();
values.put(User.KEY_NAME, nameText.getText().toString());
values.put(User.KEY_AGE, Integer.parseInt(ageText.getText().toString()));
values.put(User.KEY_HEIGHT, Float.parseFloat(heightText.getText().toString()));
//二、解析Uri
//content://com.newer.userprovider/user
/**
* "content://" + AUTHORITY + "/" + PATH_MULTIPLE;
*/
//content://com.newer.userprovider/user/1(EditText)
Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" + idEntry.getText().toString());
int recordCount = contentResolver.update(uri, values, null, null);
String msg = "更新ID为"+idEntry.getText().toString()+"的数据" + (recordCount>0?"成功":"失败");
labelView.setText(msg);
}
});
//删除指定编号记录
deleteButton = (Button)findViewById(R.id.delete);
deleteButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//二、解析Uri
//content://com.newer.userprovider/user/1
//ContentResolver-->ContentProvider
Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" +idEntry.getText().toString());
int result = contentResolver.delete(uri, null, null);
String msg = "删除ID为"+ idEntry.getText().toString()+"的数据" + (result>0?"成功":"失败");
labelView.setText(msg);
}
});
//4)、删除所有记录,不需要修改ContentProvier
deleteAllButton = (Button)findViewById(R.id.delete_all);
deleteAllButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//删除多条
//content://com.newer.userprovider/user
//一、ContentResovler删除全部记录
contentResolver.delete(User.CONTENT_URI, null, null);
String msg = "数据全部删除" ;
labelView.setText(msg);
}
});
//查询指定编号的记录
queryButton = (Button)findViewById(R.id.query);
queryButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse(User.CONTENT_URI_STRING + "/" + idEntry.getText().toString());
//query()-->ContentProvider SqliteQueryBuilder.query
Cursor cursor =contentResolver.query(uri,new String[] { User.KEY_ID, User.KEY_NAME, User.KEY_AGE, User.KEY_HEIGHT},null, null, null);
if (cursor == null){
labelView.setText("数据库中没有数据");
return;
}
String msg = "";
if (cursor.moveToFirst()){
msg += "ID:" +
cursor.getInt(cursor.getColumnIndex(User.KEY_ID)) + ",";
msg += "姓名:" +
cursor.getString(cursor.getColumnIndex(User.KEY_NAME))+ ",";
msg += "年龄:" +
cursor.getInt(cursor.getColumnIndex(User.KEY_AGE)) + ", ";
msg += "身高:" +
cursor.getFloat(cursor.getColumnIndex(User.KEY_HEIGHT)) + "\n";
}
labelView.setText("数据库:");
displayView.setText(msg);
}
});
//6)、查询全部记录
queryButton = (Button)findViewById(R.id.query_all);
queryButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Cursor cursor =
//全部查询
contentResolver.query(
User.CONTENT_URI,
new String[] { User.KEY_ID, User.KEY_NAME,
User.KEY_AGE, User.KEY_HEIGHT},
null, null, null);
if (cursor == null){
labelView.setText("数据库中没有数据");
return;
}
labelView
.setText("数据库:" + String.valueOf(cursor.getCount()) + "条记录");
String msg = "";
if (cursor.moveToFirst()){
do{
msg += "ID:" +
cursor.getInt(cursor.getColumnIndex(User.KEY_ID)) + ",";
msg += "姓名:" +
cursor.getString(cursor.getColumnIndex(User.KEY_NAME))+ ",";
msg += "年龄:" +
cursor.getInt(cursor.getColumnIndex(User.KEY_AGE)) + ", ";
msg += "身高:" +
cursor.getFloat(cursor.getColumnIndex(User.KEY_HEIGHT)) + "\n";
}while(cursor.moveToNext());
}
displayView.setText(msg);
}
});
}
}