【Android】使用ContentProvider进行应用之间的数据共享

来源:互联网 发布:linux 网络调试工具 编辑:程序博客网 时间:2024/06/08 06:06

ContentProvider为存储和读取数据提供了统一的接口,使用它,应用程序可以实现数据共享,android许多内置的数据都是使用ContentProviderr形式,如通讯录等。

ContentProvider为本地的存储提供了一个统一的接口,使得外部的程序可以通过ContentResolver提供的方法来访问其他应用提供的共享数据。下面示例中讲创建两个程序,第一个程序利用本地的sqlite数据库为外部程序提供ContentProvider数据共享接口,本地程序和外部程序都可以通过ContentResolver的增删改查方法对共享数据进行操作。

ContentProvider内置的数据增删改查方法用于封装本地数据库的增删改查方法。所以ContentProvider提供了统一的数据接口为外部应用操作共享数据,它封装了本地数据存储的方式,以统一的形式开放给外部使用。

首先创建第一个应用,用于提供共享数据:

在Manifest中注册ContentProvider

<provider android:name="MyContentProvider"            android:authorities="com.example.wayne_t.contentproviderdetail.MyContentProvider"/>

      用于外部共享的数据在该程序中将会存储与中,外部程序想要访问共享数据时无需知道数据在源程序中是如何存储的,只需知道ContentProviderr的Uri然后使用ContentResolver的数据操作方法即可

      本地创建一个sqlite数据库,并添加一张表                                                            

public class DatabaseHelper extends SQLiteOpenHelper{    private static final int VERSION = 1;    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {        super(context, name, factory, version);    }    public DatabaseHelper(Context context, String name) {        this(context, name, VERSION);    }    public DatabaseHelper(Context context, String name, int version) {        this(context, name, null, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        Log.i("WtDataBase", "create a database");        String sql = "create table user(id int, name varchar(20))";        db.execSQL(sql);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        Log.i("WtDataBase", "update a Database");    }}

       然后创建一个ContentProviderr的导出类,把数据库的增删改查方法封装到ContentProviderr对应的数据库操作方法中。我们创建的ContentProviderr导出类位置应该与Manifest中注册的位置一样,否则将会报错。

      重写其中增删改查的方法

public class MyContentProvider extends ContentProvider {    private SQLiteDatabase sqlDB;    private DatabaseHelper dbHelper;    private static final String  DATABASE_NAME = "test.db";    private static final int  DATABASE_VERSION= 1;    private static final String TABLE_NAME= "user";    @Override    public boolean onCreate() {        dbHelper = new DatabaseHelper(getContext(), DATABASE_NAME);        return (dbHelper == null) ? false : true;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();        SQLiteDatabase db = dbHelper.getReadableDatabase();        qb.setTables(TABLE_NAME);        Cursor c = qb.query(db, projection, selection, null, null, null, sortOrder);        c.setNotificationUri(getContext().getContentResolver(), uri);        return c;    }    @Override    public String getType(Uri uri) {        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values) {        sqlDB = dbHelper.getWritableDatabase();        long rowId = sqlDB.insert(TABLE_NAME, "", values);        if(rowId > 0) {            Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();            getContext().getContentResolver().notifyChange(rowUri, null);            sqlDB.close();            return rowUri;        }        sqlDB.close();        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        sqlDB = dbHelper.getWritableDatabase();        int state = sqlDB.delete(TABLE_NAME, selection, selectionArgs);        sqlDB.close();        return state;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        sqlDB = dbHelper.getWritableDatabase();        int state =  sqlDB.update(TABLE_NAME, values, selection, selectionArgs);        sqlDB.close();        return state;    }}

    下面我们通过另一程序对上述程序提供的共享数据库进行操作

    首先需要在Manifest文件中添加许可

<uses-permission android:name="android.permission.READ_CONTACTS"/>
   创建目标ContentProvider的Uri

public static final Uri CONTENT_URI = Uri.parse("content://com.example.wayne_t.contentproviderdetail.MyContentProvider");

      使用ContentResolver的数据操作方法对共享数据进行操作

    private void display() {        String columns[] = new String[] {"id", MyUser.User.USER_NAME};        Uri myUri = MyUser.User.CONTENT_URI;        Cursor cur = managedQuery(myUri, columns, null, null, null);        if(cur.moveToFirst()) {            String id = null;            String userName = null;            do {                id = cur.getString(cur.getColumnIndex("id"));                userName = cur.getString(cur.getColumnIndex(MyUser.User.USER_NAME));                Toast.makeText(MainActivity.this, "id = " + id + " name = " + userName, Toast.LENGTH_SHORT).show();            } while(cur.moveToNext());            cur.close();        }    }    private void update() {        ContentResolver cr = this.getContentResolver();        Uri myUri = MyUser.User.CONTENT_URI;        ContentValues cv = new ContentValues();        cv.put("name", "contentResolverUpdate");        cr.update(myUri, cv, "id=?", new String[]{"2"});    }    private void add() {        ContentResolver cr = this.getContentResolver();        Uri myUri = MyUser.User.CONTENT_URI;        ContentValues cv = new ContentValues();        cv.put("id", "1");        cv.put("name", "new data");        cr.insert(myUri, cv);    }    private void delete() {        ContentResolver cr = this.getContentResolver();        Uri myUri = MyUser.User.CONTENT_URI;        cr.delete(myUri, "id=?", new String[]{"2"});    }
      然后创建几个按钮分别触发增删改查事件,验证是否成功。当然也可以在第一个程序中使用ContentResolver去操作共享数据。


0 0
原创粉丝点击