Android__ContentProvider

原创 2016年05月31日 21:05:17

内容加载器:主要实现不同程序之间的数据共享的功能

两种用法:
一种是使用现有的内容加载器来读取和操作相应程序中的数据
另一种是创建自己的内容加载器俩提供外部访问的接口

访问其他程序的数据:
当一个应用程序通过内容加载器提供了外部访问的接口
一定要用到ContentResolver类

ContentResolver:
获取实例 通过getContentResolver()获取

然后再调用其类下面的insert() update() delete() query()方法

如下面的案例:获取手机联系人

public class MainActivity extends Activity {

    ListView contactsView;

    ArrayAdapter<String> adapter;

    List<String> contactsList = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        contactsView = (ListView) findViewById(R.id.contacts_view);
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);
        contactsView.setAdapter(adapter);
        readContacts();
    }




    private void readContacts() {
        Cursor cursor = null;
        try {
            //注意这里的Uri 一般Uri uri = Uri.parse("content://com.example.app.provider/table1");
            //而这里是Android系统本身的uri
            //故在AndroidManifest.xml要加入权限
            cursor = getContentResolver().      query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, null);
    while (cursor.moveToNext()) {
        String displayName = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String number = cursor.getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
       contactsList.add(displayName + "\n" + number);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }

}

创建自定义的内容加载器:

我们在一个app1工程里创建一个MyContentProvider内容提供器
也就相当于创建了一个访问该程序数据的接口

然后再另一个app2里先新建个
Uri uri = Uri.parse(“content://com.example.app1name.provider/book”);
再调用getContentResolver().insert…..等方法;
getContentResolver()相当于获取到MyContentProvider对象

如案例访问数据库的操作:

//在一个工程中创建内容加载器
public class MyContentProvider extends ContentProvider {

    private static final int BOOK_DIR=0;
    private static final int BOOK_ITEM=1;
    private static final int CATEGORY_DIR=2;
    private static final int CATEGORY_ITEM=3;

    private static final String ATHORITY ="com.baozhong.database.provider";

    private static UriMatcher uriMatcher;
    private MyDatabase dbHelper;
    //public class MyDatabase extends SQLiteOpenHelper

    //为内容加载器,可以设置要访问的内容

    static{
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(ATHORITY,"book" , BOOK_DIR);
        uriMatcher.addURI(ATHORITY,"book/#" , BOOK_ITEM);
        uriMatcher.addURI(ATHORITY,"category" , CATEGORY_DIR);
        uriMatcher.addURI(ATHORITY,"category/#" ,CATEGORY_ITEM);
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        dbHelper = new MyDatabase(getContext(), "Book.db", null, 2);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub

        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor =null;

        switch(uriMatcher.match(uri)){
        case BOOK_DIR:
            cursor = db.query("Book", projection, selection, 
                    selectionArgs, null, null, sortOrder);

            break;
        case BOOK_ITEM:
            String bookid = uri.getPathSegments().get(1);
            cursor = db.query("Book", projection, selection, 
                    selectionArgs, null, null, sortOrder);
            break;
        case CATEGORY_DIR:
            cursor = db.query("Category", projection, selection, 
                    selectionArgs, null, null, sortOrder);
            break;
        case CATEGORY_ITEM:
            String categoryid=uri.getPathSegments().get(1);
            cursor = db.query("Category", projection, selection, 
                    selectionArgs, null, null, sortOrder);
            break;
        default:
            break;
        }
        return cursor;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        switch(uriMatcher.match(uri)){
        case BOOK_DIR:
            return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.book";

        case BOOK_ITEM:
            return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.book";

        case CATEGORY_DIR:
            return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.category";

        case CATEGORY_ITEM:
            return "vnd.android.cursor.dir/vnd.com.baozhong.database.provider.category";

        default:
            break;
        }
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri urireturn =null;

        switch(uriMatcher.match(uri)){

        case BOOK_DIR:
        case BOOK_ITEM:
            long newBookId = db.insert("Book", null, values);
            urireturn = Uri.parse("content://"+ATHORITY +"/book/"+newBookId);
            break;
        case CATEGORY_DIR:
        case CATEGORY_ITEM:
            long newcategoryId = db.insert("Category", null, values);
            urireturn = Uri.parse("content://"+ATHORITY +"/book/"+newcategoryId);
            break;
        default:
            break;
        }


        return urireturn;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int deleteRows = 0;
        switch(uriMatcher.match(uri)){
        case BOOK_DIR:
            deleteRows = db.delete("Book", selection, selectionArgs);
            break;
        case BOOK_ITEM:
            String bookId = uri.getPathSegments().get(1);
            deleteRows = db.delete("Book", "id=?", new String[] {bookId});
            break;
        case CATEGORY_DIR:
            deleteRows = db.delete("Category", selection, selectionArgs);
            break;

        case CATEGORY_ITEM:
            String categoryId = uri.getPathSegments().get(1);
            deleteRows = db.delete("Book", "id=?", new String[] {categoryId});
            break;
        default:
            break;


        }
        return deleteRows;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int updateRows = 0;
        switch(uriMatcher.match(uri)){

        case BOOK_DIR:
            updateRows = db.update("Book",values,selection,selectionArgs);
            break;

        case BOOK_ITEM:
            String bookid = uri.getPathSegments().get(1);
            updateRows = db.update("Book", values, "id=?", new String[]{bookid});
            break;

        case CATEGORY_DIR:
            updateRows = db.update("Category",values,selection,selectionArgs);
            break;

        case CATEGORY_ITEM:
            String categoryid = uri.getPathSegments().get(1);
            updateRows = db.update("Category", values, "id=?", new String[]{categoryid});
            break;

        default:
            break;
        }


        return updateRows;
    }

}
//在另一个工程实现访问和操作

    public class MainActivity extends Activity{
    private String newId;

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        Button addData = (Button)findViewById(R.id.add);
        addData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Uri uri =Uri.parse("content://com.baozhong.database.provider/book");

                ContentValues values = new ContentValues();



                values.put("name", "A Clash Of King");
                values.put("author", "George Martin");
                values.put("pages", 1040);
                values.put("price", 40.55);

                Log.d("Add", "B");

                Uri newUri = getContentResolver().insert(uri, values);
                newId = newUri.getPathSegments().get(1);
                Log.d("newId", newId);


            }
        });


        Button queryData =(Button)findViewById(R.id.query);
        queryData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Uri uri = Uri.parse("content://com.baozhong.database.provider/book");

                Cursor cursor = getContentResolver().query(uri, null, null, null, null);

                if(cursor!=null){
                    while(cursor.moveToNext()){
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));

                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));

                        Toast.makeText(MainActivity.this, 
                                "name: "+name+" author: "+author+" pages: "+pages+" price: "+price,
                                Toast.LENGTH_SHORT).show();

                    }
                    cursor.close();
                }
            }
        });

        Button updateData = (Button)findViewById(R.id.update);
        updateData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //有点不一样
                Uri uri = Uri.parse("content:"
                        + "//com.baozhong.database.provider/book/"+newId);

                ContentValues values = new ContentValues();
                values.put("name", "A storm of Sword");
                values.put("pages",1216);
                values.put("price", 24.05);
//              Log.d("newId", newId);

                getContentResolver().update(uri, values, null, null);

            }
        });

        Button deleteData =(Button)findViewById(R.id.delete);
        deleteData.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Uri uri = Uri.parse("content://com.baozhong.database.provider/book/"+newId);


                getContentResolver().delete(uri, null, null);


            }
        });

    }

}

以上就实现了跨程序的自定义的内容提供器的访问

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android ContentProvider

  • 2014年12月19日 11:38
  • 9.31MB
  • 下载

Android ContentProvider全面解析

  • 2016年11月18日 11:24
  • 33.63MB
  • 下载

Android:关于ContentProvider的知识都在这里了!

前言 ContentProvider属于 Android的四大组件之一 本文全面解析了 ContentProvider ,包括ContentProvider 原理、使用方法 & 实例讲解,希望你们会喜...

android 数据共享(ContentProvider)

  • 2016年10月04日 16:44
  • 7.79MB
  • 下载

Android四大组件ContentProvider

  • 2016年08月31日 20:37
  • 10.06MB
  • 下载

android ContentProvider读取其他应用数据库

android中,保存和读取数据数据的方式很多种,大致上有网络保存,内存记忆,文件保存和数据库保存。 而应用之间的数据库数据分享,读写,主要用到的便是ContentProvider. 为什...
  • gan303
  • gan303
  • 2016年10月24日 14:36
  • 1127

android开发contentprovider

  • 2013年08月10日 20:49
  • 1.17MB
  • 下载

android 用ContentProvider操作文件

  • 2012年12月20日 17:36
  • 48KB
  • 下载

IPC机制系列之三 Android中的IPC方式 (ContentProvider,Socket)

ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式,和Messenger一样,ContentProvider的底层实现同样也是Binder,他的使用比较简单主要...
  • bydbbb
  • bydbbb
  • 2017年10月18日 16:53
  • 74

Android学习之自定义ContentProvider类

  • 2014年10月25日 18:00
  • 1.41MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android__ContentProvider
举报原因:
原因补充:

(最多只允许输入30个字)