这个例子是自定义ContentProvider,共享Sqlite数据库数据,另一个程序访问ContentProvider
项目结构:
Android_11_002_pd_data项目是创建数据库,并且用内容题供者提供数据。
包含3个类
MainActivity没用
DbOpenHelper继承SQLiteOpenHelper,这个类的对象是创建数据库和
表的。helper.getWritableDatabase();创建数据库和表的
MyContent继承ContentProvider(内容题供者)
在onCreate方法中创建DbOpenHelper对象db。
接着就是使用db创建数据库并进行增删改查,对外提供接口。
特别注意:在MyContent(内容题供者)在注册的时候
<provider
android:name="com.data.android.activity.MyContent"
android:authorities="com.zhh"
android:exported="true"
></provider>
三个属性都要有,少一个就错了
Android_11_002_pd_visitydata 项目是访问数据的
只有一个类MainActivity
在MainActivity中进行增删改查,访问对应的MyContent中的增删改查
核心代码:
Android_11_002_pd_data项目中 (项目是创建数据库,并且用内容题供者提供数据。)
DbOpenHelper
public class DbOpenHelper extends SQLiteOpenHelper {
public DbOpenHelper(Context context) {
super(context, "dog_db.db", null, 1);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table dog(_id integer primary key autoincrement,pname varchar(20),page integer)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
MyContent
/*
* 自定义contentprovider操作数据库
1、自定义一个 类继承ContentProvider。
*
* 2、在配置文件中进行注册。
*
* 3、根据需要完成内部的对应的方法。
*
* 4、在别的应用中进行访问。
*
* 在配置中定义的权限为: android:authorities="com.zhh"
*/
public class MyContent extends ContentProvider {
DbOpenHelper helper = null;
// 路径匹配器
private static final int DOGS = 1;
private static final int DOG = 2;
/* UriMatcher
* 1、使用addURI方法用于添加/注册Uri路径
* 2、使用match方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配
* 码就是是调用addURI()方法传入的第三个参数
*/
private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
/*三个参数
* 1权限,和主清单文件中保持一致
* 2路径,传入表名,或者表名后加#(#表示匹配任意长度的数字),表示表中某一行
* 3自定义号码。
*/
matcher.addURI("com.zhh", "dog", DOGS);
matcher.addURI("com.zhh", "dog/#", DOG);
}
/**
* 初始化内容提供者的时候调用。通常会在这里完成对数据库的创建和升级等操作。
* 注意,只有当存在ContentResolver尝试访问我们程序中的数据时,内容
* 提供者才会被初始化
*/
@Override
public boolean onCreate() {
helper = new DbOpenHelper(getContext());
if (helper != null) {
return true;
}
return false;
}
/* ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法
* 1、withAppendedId(uri, id)用于为路径加上ID部分
* 2、parseId(uri)方法用于从路径中获取ID部分
*/
/**
* 向内容提供者中添加一条数据,
* 使用uri参数来确定要添加到的表,
* 待添加的数据保存在values参数中。
* 添加完成后,返回一个用于
* 表示这条新纪录的URI.
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
// 使用match方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码就是是调用addURI()方法传入的第三个参数
SQLiteDatabase db = helper.getWritableDatabase();
Uri newuri = null;
if (matcher.match(uri) == DOGS) {
long id = db.insert("dog", null, values);
newuri = ContentUris.withAppendedId(uri, id);
// id指的是插入数据的ID号
System.out.println(id + ">>>>>>>>>>>>");
}
return newuri;
}
/**
*从内容提供者中删除数据,使用uri参数来确定删除哪一张表中的数据,selection和selectionArgs
*的参数用于约束删除那些行,被删除的行数做为返回值返回
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = helper.getWritableDatabase();
int code = matcher.match(uri);
int num = 0;
switch (code) {
case DOG:
num = db.delete("dog", selection, selectionArgs);
break;
case DOGS:
num = db.delete("dog", null, null);
break;
}
return num;
}
/**
* 更新内容提供者中已有的数据。
* 使用uri参数来确定更新哪一张表中的数据,
* 新数据保存在values参数中,
* selection和selectionArgs参数用于约束更新那些行,受影响的行数将作为返回值返回。
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = helper.getWritableDatabase();
int code = matcher.match(uri);
int num = 0;
switch (code) {
case DOG:
num = db.update("dog", values, selection, selectionArgs);
break;
case DOGS:
num = db.update("dog", values, null, null);
break;
}
return num;
}
/**
*
* 从内容提供者中查询数据。
* uri参数来确定查询那张表,
* projection参数用于确定查询那些列
* selection和selectionArgs参数用于约束查询那些行
* sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回
*
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = helper.getReadableDatabase();
int code = matcher.match(uri);
Cursor c = null;
switch (code) {
case DOG:
c = db.query("dog", null, selection, selectionArgs, null, null,
null);
break;
case DOGS:
c=db.query("dog", null, null, null, null, null, null);
break;
}
return c;
}
/**
* 根据传入的内容URI来返回相应的MIME类型
*/
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
}//class
Android_11_002_pd_visitydata(项目是访问数据的)项目中
MainActivity
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 增
public void btn_insert(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog");
/**
* URI一般由三部分组成:
访问资源的命名机制,一般固定是content:
存放资源的注册时的权限,必须和内容提供者注册时设置的android:authorities="com.zhh"保持一致
资源自身的名称,由路径表示,一般是表名或表名加"/数字"
*/
ContentValues values = new ContentValues();
values.put("pname", "zhang3");
values.put("page", 20);
resolver.insert(uri, values);//间接调对应MyContent中的insert方法(不是直接调用)
Toast.makeText(this, "添加数据", 5).show();
}
//删除一条数据
public void btn_delete(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog/7");
// 从uri中分离出id
long id = ContentUris.parseId(uri);
StringBuffer sb = new StringBuffer();
String w = sb.append(id).toString();
// 把id拼到sql语句中(在uri中有7,为什么还要在后面拼接id=7)
resolver.delete(uri, "_id=?", new String[]{w});//间接调对应MyContent中的delete方法
Toast.makeText(this, "删除成功", 3).show();
}
// 删除所有数据
public void btn_alldelete(View v){
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog");
resolver.delete(uri, null, null);
Toast.makeText(this, "删除成功", 3).show();
}
// 修改一条数据
public void btn_update(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog/8");
ContentValues values = new ContentValues();
values.put("pname", "zhang4");
values.put("page", 63);
// 从uri中分离出id
long id = ContentUris.parseId(uri);
StringBuffer sb = new StringBuffer();
String w = sb.append(id).toString();
// 把id拼到sql语句中
resolver.update(uri, values, "_id=?", new String[] { w });//间接调对应MyContent中的update方法
Toast.makeText(this, "修改成功", 5).show();
}
// 修改所有数据
public void btn_allupdate(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog");
ContentValues values = new ContentValues();
values.put("pname", "zhang6");
values.put("page", 63);
// 把id拼到sql语句中
resolver.update(uri, values, null, null);
Toast.makeText(this, "修改成功", 5).show();
}
// 查找一条数据
public void btn_query(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog/8");
StringBuffer sb = new StringBuffer();
long id = ContentUris.parseId(uri);
String w = sb.append(id).toString();
Cursor c = resolver.query(uri, null, "_id=?", new String[] { w }, null);//间接调对应MyContent中的query方法
while (c.moveToNext()) {
String pname = c.getString(c.getColumnIndex("pname"));
int page = c.getInt(c.getColumnIndex("page"));
System.out.println("....." + pname + "。。。。。" + "....." + page);
}
Toast.makeText(this, "查找成功", 3).show();
}
// 查找所有数据
public void btn_allquery(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.zhh/dog");
Cursor c = resolver.query(uri, null, null, null, null);
while (c.moveToNext()) {
String pname = c.getString(c.getColumnIndex("pname"));
int page = c.getInt(c.getColumnIndex("page"));
System.out.println("....." + pname + "。。。。。" + "....." + page);
}
Toast.makeText(this, "查找成功", 3).show();
}
}//class
这个例子较为复杂,没明白请下载我的demo
http://download.csdn.net/detail/zhaihaohao1/8335917