Android中ContentProvider(内容题供着)2访问自定义的内容提供者,共享Sqlite数据库数据

ContentProvider(内容提供者)主要用于跨项目访问(操作)数据。

这个例子是自定义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











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值