content Provider

使用內容提供器是 Android 實現跨程序共享數據的標準方式。
實現各個應用程序之間的(跨應用)數據共享,
這裏寫圖片描述

ContentProvider是怎麼實現數據共享的呢?

(1) URI
URI:統一資源標識符,代表要操作的數據,可以用來標識每個ContentProvider,這樣你就可以通過指定的URI找到想要的ContentProvider,從中獲取或修改數據。
(2) MIME
MIME是指定某個擴展名的文件用一種應用程序來打開,就像你用瀏覽器查看PDF格式的文件,瀏覽器會選擇合適的應用來打開一樣。

讀取手機聯繫方式

private void readContacts() { 
    Cursor cursor = null; 
    try {
        // 查詢聯繫人數據
        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(); 
    }

讀取DB

public class DatabaseProvider extends ContentProvider {
    public static final int BOOK_DIR = 0;
    public static final int BOOK_ITEM = 1;
    private static UriMatcher uriMatcher;
    private MyDatabaseHelper dbHelper;

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

    @Override
    public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);
        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    // 查詢數據
        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, "id = ?", new String[]{bookId}, null,
                        null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
    // 添加數據
        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://com.example.databasetest.provider/book/" + newBookId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.databasetest.provider.book";
            case BOOK_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasetest.provider.book ";
            return null;
        }
    }
}
發佈了31 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章