您的位置:首页 > 编程语言 > PHP开发

使用ContentProvider实现数据共享

2013-08-28 20:33 246 查看
这一篇就是针对实现SQLite数据库中数据共享的讲解,使用的方法就是ContentProvider,具体的操作步骤和对应代码如下:

1.创建数据库MySQLite,记住要继承SQLiteOpenHelper类
MySQLite.java代码如下:
package com.example.l0828_contentprovider;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySqlite extends SQLiteOpenHelper{
public static final String TABLE_NAME = "student";
public static final String ID = "_id";
public static final String NAME = "name";
public static final String SEX = "sex";
//定义的SQLite数据库的构造方法
public MySqlite(Context context) {
super(context, TABLE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库中的表,用execSQL方法
db.execSQL("CREATE TABLE " + TABLE_NAME + "( " + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + NAME
+ " TEXT NOT NULL," + SEX + " TEXT NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}
}
2.创建自定义的MyCP类,继承ContentProvider类,主要可以分为如下几个步骤:
(1)继承ContentProvider类;
(2)对属性(数据库中的表名,列名等)封装;
(3)重写相应的方法(下列代码中有详细说明),对操作数据库的方法进行封装;
MyCPU.java文件如下:
package com.example.l0828_contentprovider;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
/*
* 创建继承ContentProvider的类用于包装数据库的操作,以实现数据共享
*/
public class MyCPU extends ContentProvider{
public static final String CP_TABLE_NAME = MySqlite.TABLE_NAME;
public static final String CP_ID = MySqlite.ID;
public static final String CP_NAME = MySqlite.NAME;
public static final String CP_SEX = MySqlite.SEX;
private SQLiteDatabase dbReader;
private SQLiteDatabase dbWriter;
public static final Uri URI=Uri.parse("content://com.example.l0828_contentprovider.MyCPU");
/**对onCreate方法的重写 **/
@Override
public boolean onCreate() {
//在onCreate方法中实现数据库的实例,以及数据库可读可写对象
MySqlite my=new MySqlite(getContext());
dbReader=my.getReadableDatabase();
dbWriter=my.getWritableDatabase();
return false;
}
/**对查询方法的封装**/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return dbReader.query(CP_TABLE_NAME, null, selection, selectionArgs, null, null, sortOrder);
}
/**重写getType方法,用以得到Uri的字符串**/
@Override
public String getType(Uri uri) {
return uri.toString();
}
/**对插入方法的封装**/
@Override
public Uri insert(Uri uri, ContentValues values) {
dbWriter.insert(CP_TABLE_NAME, null, values);
return uri;
}
/**对删除操作方法的封装**/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return dbWriter.delete(CP_TABLE_NAME, selection, selectionArgs);
}
/**对更新操作方法的封装**/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return dbWriter.update(CP_TABLE_NAME, values, selection, selectionArgs);
}
}
3.Provider的注册:
我们都知道Android的四大组件的使用都是需要注册的,Provider也是一样,需要注册的属性有:

(1)name="继承ContentProvider的类的类名"
(2)authorites="包名.类名"
本例中注册的代码如下:
<provider
android:name="MyCPU"
android:authorities="com.example.l0828_contentprovider.MyCPU"></provider>


4.使用资源Uri:
Uri是指直接对资源的引用,而不需要地址,即不同于URL,固定的写法:
Uri.parse("content://包名.类名");
代码见MyCP.java中。

5.在MainActivity.java文件中实现对数据库操作的测试:
MainActivity.java:
package com.example.l0828_contentprovider;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
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;
public class MainActivity extends Activity implements OnClickListener{
private EditText et_name,et_sex;
private Button btn_add,btn_select,btn_delete,btn_update;
private TextView tv_show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name=(EditText) findViewById(R.id.et_name);
et_sex=(EditText) findViewById(R.id.et_sex);
btn_add=(Button) findViewById(R.id.btn_add);
btn_delete=(Button) findViewById(R.id.btn_delete);
btn_update=(Button) findViewById(R.id.btn_update);
btn_select=(Button) findViewById(R.id.btn_select);
tv_show=(TextView) findViewById(R.id.tv_show);
btn_add.setOnClickListener(this);
btn_delete.setOnClickListener(this);
btn_update.setOnClickListener(this);
btn_select.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_add:
addDB();
break;
case R.id.btn_delete:
deleteDB();
break;
case R.id.btn_update:
updateDB();
break;
case R.id.btn_select:
selectDB();
break;
}
}
public void addDB(){
ContentValues cv=new ContentValues();
cv.put(MyCPU.CP_NAME,et_name.getText().toString());
cv.put(MyCPU.CP_SEX, et_sex.getText().toString());
MainActivity.this.getContentResolver().insert(MyCPU.URI, cv);
}
public void deleteDB(){
MainActivity.this.getContentResolver().delete(MyCPU.URI,null , null);
}
public void updateDB(){
ContentValues cv = new ContentValues();
cv.put(MyCPU.CP_NAME,et_name.getText().toString());
cv.put(MyCPU.CP_SEX, et_sex.getText().toString());
MainActivity.this.getContentResolver().update(MyCPU.URI, null,null, null);
}
public Cursor selectDB(){
Cursor c=getContentResolver().query(MyCPU.URI, null, null, null, null);
while(c.moveToNext()){
tv_show.setText(c.getString(c.getColumnIndex(MyCPU.CP_NAME))+
" "+c.getString(c.getColumnIndex(MyCPU.CP_SEX)));
}
return c;
}
}


运行结果如下:







6.数据共享的实现:
以上我们仅仅实现了本应用程序内部的对数据库数据的使用,下面我们就要真正的实现数据共享了,即除此应用程序之外的应用程序也可以访问和修改数据:
下面我们新建一个应用程序:在MainActivity.java中我们对上面的应用程序的数据库进行简单的数据操作:

package com.example.l0828_using_contentprovider;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
selectDB();
}
public void selectDB(){
Cursor c=getContentResolver().query(
Uri.parse("content://com.example.l0828_contentprovider.MyCPU"),
null, null, null, null);
while(c.moveToNext()){
//这个必须是列名哦哦哦
System.out.println("外部访问:"+c.getString(c.getColumnIndex("name")));
System.out.println("外部访问:"+c.getString(c.getColumnIndex("sex")));
}
}
}
结果:



本文出自 “MySpace” 博客,请务必保留此出处http://wangzhaoli.blog.51cto.com/7607113/1284567
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: