Android 使用contentprovider内容提供者完成跨进程间通信

ContentProvider介绍:

 ContentProvider是Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。

        其实是比较低调的一个,日常开发中使用的频率也没那三位多。它的诞生就是为了给不同应用提供内容访问,自然在我们研究的“多进程通信方式”之中。ContentProvider 封装了数据的跨进程传输,我们可以直接使用 getContentResolver() 拿到 ContentResolver 进行增删改查即可。ContentProvider 以一个或多个表(与在关系型数据库中的表类似)的形式将数据呈现给外部应用。 行表示提供程序收集的某种数据类型的实例,行中的每个列表示为实例收集的每条数据。

app提供的内容:

MySqliteHelper(创建的一个数据库,名字叫Students , 版本号是  1 )

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MySqliteHelper extends SQLiteOpenHelper {
    private static  String sqlName = "Students";
    private static  int version = 1;

    public MySqliteHelper(Context context) {
        super(context, sqlName, null, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("create table Student(id integer primary key autoincrement,name varchar(20),age varchar(10))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

}

MyProvider(使用UriMatcher本质上是文本过滤器,就不用手动过滤字符串了,如果用手动比较麻烦,维护性也不好)

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class MyProvider extends ContentProvider{
    private MySqliteHelper helper;
    private SQLiteDatabase database;
    private String tabName="Student";
    private UriMatcher matcher;
    private static final int STUDENT=666;
    private String authority="com.example.csdn.MyProvider";
    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        helper=new MySqliteHelper(getContext());
        matcher=new UriMatcher(UriMatcher.NO_MATCH);
        matcher.addURI(authority, tabName, STUDENT);

        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        int code=matcher.match(uri);
        database=helper.getReadableDatabase();
        Cursor cursor=database.query(tabName, projection, selection, null, null, null, null);
        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        int code=matcher.match(uri);
        database=helper.getWritableDatabase();
        database.insert(tabName, null, values);
        //将这个值插入到tabName中,对应这个值的编号
        long studentid=database.insert(tabName, null, values);
        Uri studenturi=ContentUris.withAppendedId(uri, studentid);
        return studenturi;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        int code=matcher.match(uri);
        database=helper.getWritableDatabase();
        long studentid=database.delete(tabName, selection, selectionArgs);
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODO Auto-generated method stub
        int code=matcher.match(uri);
        database=helper.getWritableDatabase();
        long studentid=database.update(tabName, values, selection, selectionArgs);
        return 0;
    }

}

需要在配置清单注册:(记得一定要声明authorities , 不指定这个属性的话其他应用,无法通过Uri访问你的数据库

<provider
    android:name="com.example.csdn.MyProvider"
    android:authorities="com.example.csdn.MyProvider"
    android:exported="true" >
</provider>


另一个app获取提供的数据:

通过getContentResolver();获取数据,然后使用正删改查进行操作。

import java.util.ArrayList;
import java.util.List;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity implements OnClickListener {
    private Button mBtn_insert;
    private Button mbtn_delete;
    private Button mBtn_update;
    private Button mBtn_query;
    private ContentResolver resovler;
    private ListView mLv;
    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 字符串类型的uri 转成Uri类型
        String uriStr = "content://com.example.csdn.MyProvider/Student";
        uri = Uri.parse(uriStr);
        // 获取resolver的实例
        resovler = getContentResolver();
        initView();
    }

    public void initView() {
        mBtn_insert = (Button) findViewById(R.id.mBtn_insert);
        mBtn_delete=(Button) findViewById(R.id.mBtn_delete);
        mBtn_update=(Button) findViewById(R.id.mBtn_update);
        mBtn_query = (Button) findViewById(R.id.mBtn_query);
        mLv = (ListView) findViewById(R.id.lv);

        mBtn_insert.setOnClickListener(this);
        mBtn_delete.setOnClickListener(this);
        mBtn_update.setOnClickListener(this);
        mBtn_query.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
            case R.id.mBtn_insert:
                ContentValues values = new ContentValues();
                values.put("name", "杰哥");
                values.put("age", "26");
                resovler.insert(uri, values);
                break;
            case R.id.mBtn_delete:
                resovler.delete(uri, "name=?", new String[]{"杰哥"});
                break;
            case R.id.mBtn_update:
                ContentValues contentValues=new ContentValues();
                contentValues.put("name","颖宝");
                contentValues.put("age",20);
                resovler.update(uri, contentValues, "name=?", new String[]{"杰哥"});
                break;
            case R.id.mBtn_query:
                List<String> list = new ArrayList<String>();
                Cursor cursor = resovler.query(uri, null, null, null, null);
                while (cursor.moveToNext()) {
                    int nameIndex = cursor.getColumnIndex("name");
                    int ageIndex = cursor.getColumnIndex("age");
                    String nameStr = cursor.getString(nameIndex);
                    String ageStr = cursor.getString(ageIndex);
                    list.add(nameStr + ageStr);
                }
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1, list);
                lv.setAdapter(adapter);
                break;
        }
    }

}

这个是xml布局:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/mBtn_insert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="增加" />

    <Button
        android:id="@+id/mbtn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除" />

    <Button
        android:id="@+id/mBtn_update"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改" />

    <Button
        android:id="@+id/mBtn_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询" />
</LinearLayout>

<ListView
    android:id="@+id/mLv"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

猜你喜欢

转载自blog.csdn.net/nazicsdn/article/details/79833469