这一篇就是针对实现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;
    }
}


运行结果如下:

202717463.jpg

202717247.jpg


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")));
        }
    }
}

结果:

203226884.jpg