使用內容提供器是 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;
}
}
}