这一篇就是针对实现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="包名.类名"
本例中注册的代码如下:
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"))); } } }
结果: