Android__ContentProvider

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

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

访问其他程序的数据:
当一个应用程序通过内容加载器提供了外部访问的接口
一定要用到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);


            }
        });

    }

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值