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


            }
        });

    }

}

以上就實現了跨程序的自定義的內容提供器的訪問

發佈了33 篇原創文章 · 獲贊 6 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章