欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android ContentResolver使用說(shuō)明

 更新時(shí)間:2016年01月16日 12:19:09   投稿:mdxy-dxy  
這篇文章主要介紹了Android ContentResolver使用說(shuō)明,需要的朋友可以參考下

Android是如何實(shí)現(xiàn)應(yīng)用程序之間數(shù)據(jù)共享的?一個(gè)應(yīng)用程序可以將自己的數(shù)據(jù)完全暴露出去,外界更本看不到,也不用看到這個(gè)應(yīng)用程序暴露的數(shù)據(jù)是如何存儲(chǔ)的,或者是使用數(shù)據(jù)庫(kù)還是使用文件,還是通過(guò)網(wǎng)上獲得,這些一切都不重要,重要的是外界可以通過(guò)這一套標(biāo)準(zhǔn)及統(tǒng)一的接口和這個(gè)程序里的數(shù)據(jù)打交道,例如:添加(insert)、刪除(delete)、查詢(query)、修改(update),當(dāng)然需要一定的權(quán)限才可以。

如何將應(yīng)用程序的數(shù)據(jù)暴露出去? Android提供了ContentProvider,一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)Content provider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且Content providers是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露。Content providers存儲(chǔ)和檢索數(shù)據(jù),通過(guò)它可以讓所有的應(yīng)用程序訪問(wèn)到,這也是應(yīng)用程序之間唯一共享數(shù)據(jù)的方法。要想使應(yīng)用程序的數(shù)據(jù)公開(kāi)化,可通過(guò)2種方法:創(chuàng)建一個(gè)屬于你自己的Content provider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的Content provider中,前提是有相同數(shù)據(jù)類型并且有寫(xiě)入Content provider的權(quán)限。

如何通過(guò)一套標(biāo)準(zhǔn)及統(tǒng)一的接口獲取其他應(yīng)用程序暴露的數(shù)據(jù)?Android提供了ContentResolver,外界的程序可以通過(guò)ContentResolver接口訪問(wèn)ContentProvider提供的數(shù)據(jù)。

當(dāng)前篇主要說(shuō)明,如何獲取其它應(yīng)用程序共享的數(shù)據(jù),比如獲取Android 手機(jī)電話薄中的信息。

什么是URI?

在學(xué)習(xí)如何獲取ContentResolver前,有個(gè)名詞是必須了解的:URI。URI是網(wǎng)絡(luò)資源的定義,在Android中賦予其更廣闊的含義。

將其分為A,B,C,D 4個(gè)部分:
A:標(biāo)準(zhǔn)前綴,用來(lái)說(shuō)明一個(gè)Content Provider控制這些數(shù)據(jù),無(wú)法改變的;
B:URI的標(biāo)識(shí),它定義了是哪個(gè)Content Provider提供這些數(shù)據(jù)。對(duì)于第三方應(yīng)用程序,為了保證URI標(biāo)識(shí)的唯一性,它必須是一個(gè)完整的、小寫(xiě)的  類名。這個(gè)標(biāo)識(shí)在<provider> 元素的 authorities屬性中說(shuō)明:
<provider name=”.TransportationProvider”  authorities=”com.example.transportationprovider”  . . .  >
C:路徑,Content Provider使用這些路徑來(lái)確定當(dāng)前需要生什么類型的數(shù)據(jù),URI中可能不包括路徑,也可能包括多個(gè);
D:如果URI中包含,表示需要獲取的記錄的ID;如果沒(méi)有ID,就表示返回全部;
由于URI通常比較長(zhǎng),而且有時(shí)候容易出錯(cuò),切難以理解。所以,在Android當(dāng)中定義了一些輔助類,并且定義了一些常量來(lái)代替這些長(zhǎng)字符串,例如:People.CONTENT_URI

ContentResolver 介紹說(shuō)明

看完這些介紹,大家一定就明白了,ContentResolver是通過(guò)URI來(lái)查詢ContentProvider中提供的數(shù)據(jù)。除了URI以外,還必須知道需要獲取的數(shù)據(jù)段的名稱,以及此數(shù)據(jù)段的數(shù)據(jù)類型。如果你需要獲取一個(gè)特定的記錄,你就必須知道當(dāng)前記錄的ID,也就是URI中D部分。

前面也提到了Content providers是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露出去,那么ContentResolver也將采用類似數(shù)據(jù)庫(kù)的操作來(lái)從Content providers中獲取數(shù)據(jù)?,F(xiàn)在簡(jiǎn)要介紹ContentResolver的主要接口,如下:

返回值 函數(shù)聲明
final Uri insert(Uri url, ContentValues values)Inserts a row into a table at the given URL.
final int delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI.
final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set.
final int update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI.

看到這里,是否感覺(jué)與數(shù)據(jù)庫(kù)的操作基本一樣的?就是這樣的,詳細(xì)解析請(qǐng)參考了 Android SQLite解析 中的說(shuō)明,不在此詳細(xì)說(shuō)明。

最后一個(gè)問(wèn)題:如何獲取ContentResolver?調(diào)用getContentResolver (),例如:ContentResolver cr = getContentResolver();

知道ContentResolver是通過(guò)ContentProvider來(lái)獲取其他與應(yīng)用程序共享的數(shù)據(jù),那么ContentResolver與ContentProvider的接口應(yīng)該差不多的。

其中ContentProvider負(fù)責(zé)

    * 組織應(yīng)用程序的數(shù)據(jù);
    * 向其他應(yīng)用程序提供數(shù)據(jù);

ContentResolver則負(fù)責(zé)

    * 獲取ContentProvider提供的數(shù)據(jù);
    * 修改/添加/刪除更新數(shù)據(jù)等;

ContentProvider 是如何向外界提供數(shù)據(jù)的?

Android提供了ContentProvider,一個(gè)程序可以通過(guò)實(shí)現(xiàn)一個(gè)ContentProvider的抽象接口將自己的數(shù)據(jù)完全暴露出去,而且ContentProviders是以類似數(shù)據(jù)庫(kù)中表的方式將數(shù)據(jù)暴露,也就是說(shuō)ContentProvider就像一個(gè)“數(shù)據(jù)庫(kù)”。那么外界獲取其提供的數(shù)據(jù),也就應(yīng)該與從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)的操作基本一樣,只不過(guò)是采用URI來(lái)表示外界需要訪問(wèn)的“數(shù)據(jù)庫(kù)”。至于如何從URI中識(shí)別出外界需要的是哪個(gè)“數(shù)據(jù)庫(kù)”,這就是Android底層需要做的事情了,不在此詳細(xì)說(shuō)。簡(jiǎn)要分析下ContentProvider向外界提供數(shù)據(jù)操作的接口:

query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])

這些操作與數(shù)據(jù)庫(kù)的操作基本上完全一樣,在此不詳細(xì)說(shuō),具體的解析可以參考 Android Sqlite解析 中的詳細(xì)說(shuō)明。需要特殊說(shuō)明的地方是URI:

在URI的D部分可能包含一個(gè)_ID ,這個(gè)應(yīng)該出現(xiàn)在SQL語(yǔ)句中的,可以以種特殊的方式出現(xiàn),這就要求我們?cè)谔峁?shù)據(jù)的時(shí)候,需要來(lái)額外關(guān)注這個(gè)特殊的信息。Android  SDK推薦的方法是:在提供數(shù)據(jù)表字段中包含一個(gè)ID,在創(chuàng)建表時(shí)INTEGER PRIMARY KEY AUTOINCREMENT標(biāo)識(shí)此ID字段。

ContentProvider 是如何組織數(shù)據(jù)的?

組織數(shù)據(jù)主要包括:存儲(chǔ)數(shù)據(jù),讀取數(shù)據(jù),以數(shù)據(jù)庫(kù)的方式暴露數(shù)據(jù)。數(shù)據(jù)的存儲(chǔ)需要根據(jù)設(shè)計(jì)的需求,選擇合適的存儲(chǔ)結(jié)構(gòu),首選數(shù)據(jù)庫(kù),當(dāng)然也可以選擇本地其他文件,甚至可以是網(wǎng)絡(luò)上的數(shù)據(jù)。數(shù)據(jù)的讀取,以數(shù)據(jù)庫(kù)的方式暴露數(shù)據(jù)這就要求,無(wú)論數(shù)據(jù)是如何存儲(chǔ)的,數(shù)據(jù)最后必須以數(shù)據(jù)的方式訪問(wèn)。

可能還有2個(gè)問(wèn)題,是需要關(guān)注的。

  1. ContentProvider是什么時(shí)候創(chuàng)建的,是誰(shuí)創(chuàng)建的?訪問(wèn)某個(gè)應(yīng)用程序共享的數(shù)據(jù),是否需要啟動(dòng)這個(gè)應(yīng)用程序?這個(gè)問(wèn)題在 Android SDK中沒(méi)有明確說(shuō)明,但是從數(shù)據(jù)共享的角度出發(fā),ContentProvider應(yīng)該是Android在系統(tǒng)啟動(dòng)時(shí)就創(chuàng)建了,否則就談不上數(shù)據(jù)共享了。這就要求在AndroidManifest.XML中使用<provider>元素明確定義。
  2. 可能會(huì)有多個(gè)程序同時(shí)通過(guò)ContentResolver訪問(wèn)一個(gè)ContentProvider,會(huì)不會(huì)導(dǎo)致像數(shù)據(jù)庫(kù)那樣的“臟數(shù)據(jù)”?這個(gè)問(wèn)題一方面需要數(shù)據(jù)庫(kù)訪問(wèn)的同步,尤其是數(shù)據(jù)寫(xiě)入的同步,在AndroidManifest.XML中定義ContentProvider的時(shí)候,需要考慮是<provider>元素multiprocess屬性的值;另外一方面Android在ContentResolver中提供了 notifyChange()接口,在數(shù)據(jù)改變時(shí)會(huì)通知其他ContentObserver,這個(gè)地方應(yīng)該使用了觀察者模式,在 ContentResolver中應(yīng)該有一些類似register,unregister的接口。

至此,已經(jīng)對(duì)ContentProvider提供了比較全面的分析,至于如何創(chuàng)建ContentProvider,可通過(guò)2種方法:創(chuàng)建一個(gè)屬于你自己的ContentProvider或者將你的數(shù)據(jù)添加到一個(gè)已經(jīng)存在的ContentProvider中,當(dāng)然前提是有相同數(shù)據(jù)類型并且有寫(xiě)入 Content provider的權(quán)限。在Android SDK的sample中提供的 Notepad具體實(shí)例 中去看源代碼!

制作ContentResolver實(shí)例

以上就完全介紹了如何獲取、使用ContentResolver,啟動(dòng)Eclipes,制作一個(gè)完整的實(shí)例如下:
打開(kāi)showcontent.java,修改如下:

package moandroid.showcontact;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.Phones;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;
public class showcontact extends ListActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
startManagingCursor(c);
ListAdapter adapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_2, c,
new String[] { Phones.NAME, Phones.NUMBER },
new int[] { android.R.id.text1, android.R.id.text2 });
setListAdapter(adapter);
}
}

然后在AndroidManifest.XML中<application>元素前增加如下許可:

<uses-permission android:name=”android.permission.READ_CONTACTS” />

最后運(yùn)行程序,在模擬器啟動(dòng)后,單擊Menu返回到Home界面,打開(kāi)Contacts選擇Contacts標(biāo)簽頁(yè),添加2個(gè)聯(lián)系人信息。返回到Home,選擇moandroid.showcontact運(yùn)行,剛添加的2個(gè)聯(lián)系人信息將顯示在界面上,如下:

總結(jié)說(shuō)明

ContentResolver的使用極大的方便了應(yīng)用程序之間共享數(shù)據(jù),如何將應(yīng)用程序的數(shù)據(jù)完全暴露給給他應(yīng)用程序使用了

android中ContentResolver的使用

使用ContentResolver增刪改查電話本信息,詳細(xì)代碼如下:

import android.app.ListActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListAdapter;

public class MainActivity extends ListActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		insert("tester1");
		update("tester2", new String(People.NAME + "='tester1'"));
		delete(new String(People.NAME + "='tester2'"));
		select();
	}

	/*
	 * 向聯(lián)系人列表中插入新的聯(lián)系人
	 * @param name The value of People.NAME
	 */
	public void insert(String name) {
		ContentValues ct = new ContentValues();
		ct.put(People.NAME, name);
		getContentResolver().insert(People.CONTENT_URI, ct);
	}
 
	/*
	 * 更新手機(jī)中指定的聯(lián)系人
	 * @param name A new name for People.NAME
	 * @param where The update requirement.
	 */
	public void update(String name, String where) {
		ContentValues ct = new ContentValues();
		ct.put(People.NAME, name);
		getContentResolver().update(People.CONTENT_URI, ct, where, null);
	}

	/*
	 * 刪除手機(jī)中指定的聯(lián)系人
	 * @param where The delete requirement.
	 */
	public void delete(String where) {
		getContentResolver().delete(People.CONTENT_URI, where, null);
	}

	// 查找所有聯(lián)系人
	public void select() {
		Cursor cursor = getContentResolver().query(People.CONTENT_URI,
				new String[] { People._ID, People.NAME }, null, null, null);

		ListAdapter adapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_list_item_1, cursor,
				new String[] { People.NAME }, new int[] { android.R.id.text1 });

		setListAdapter(adapter);
	}
}

AndroidManifest.xml中添加如下權(quán)限:

 <uses-permission android:name="android.permission.READ_CONTACTS"/>
 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

相關(guān)文章

  • Android自定義StickinessView粘性滑動(dòng)效果

    Android自定義StickinessView粘性滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義StickinessView粘性滑動(dòng)效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • android繪制觸點(diǎn)軌跡的代碼

    android繪制觸點(diǎn)軌跡的代碼

    這篇文章主要為大家詳細(xì)介紹了android繪制觸點(diǎn)軌跡的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Android UI系列-----ScrollView和HorizontalScrollView的詳解

    Android UI系列-----ScrollView和HorizontalScrollView的詳解

    本篇文章主要是介紹的Android UI系列-----ScrollView和HorizontalScrollView,ScrollView和HorizontalScrollView都是布局容器,有需要的可以了解一下。
    2016-11-11
  • Android實(shí)現(xiàn)Tab布局的4種方式(Fragment+TabPageIndicator+ViewPager)

    Android實(shí)現(xiàn)Tab布局的4種方式(Fragment+TabPageIndicator+ViewPager)

    Android現(xiàn)在實(shí)現(xiàn)Tab類型的界面方式越來(lái)越多,本文詳細(xì)介紹了Android實(shí)現(xiàn)Tab布局的4種方式,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-11-11
  • Android自定義加載圈動(dòng)畫(huà)效果

    Android自定義加載圈動(dòng)畫(huà)效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義加載圈動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android內(nèi)置的OkHttp用法介紹

    Android內(nèi)置的OkHttp用法介紹

    okhttp是一個(gè)第三方類庫(kù),用于android中請(qǐng)求網(wǎng)絡(luò)。這是一個(gè)開(kāi)源項(xiàng)目,是安卓端最火熱的輕量級(jí)框架,由移動(dòng)支付Square公司貢獻(xiàn)(該公司還貢獻(xiàn)了Picasso和LeakCanary) 。用于替代HttpUrlConnection和Apache HttpClient
    2022-08-08
  • Android編程實(shí)現(xiàn)將時(shí)間轉(zhuǎn)化成幾分鐘前、幾天前等形式的工具類

    Android編程實(shí)現(xiàn)將時(shí)間轉(zhuǎn)化成幾分鐘前、幾天前等形式的工具類

    這篇文章主要介紹了Android編程實(shí)現(xiàn)將時(shí)間轉(zhuǎn)化成幾分鐘前、幾天前等形式的工具類,涉及Android針對(duì)日期時(shí)間的相關(guān)運(yùn)算與判斷簡(jiǎn)單操作技巧,需要的朋友可以參考下
    2018-02-02
  • Android中創(chuàng)建快捷方式代碼實(shí)例

    Android中創(chuàng)建快捷方式代碼實(shí)例

    這篇文章主要介紹了Android中創(chuàng)建快捷方式代碼實(shí)例,本文分為三個(gè)步驟實(shí)現(xiàn),并分別給出對(duì)應(yīng)實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • Android仿360桌面手機(jī)衛(wèi)士懸浮窗效果

    Android仿360桌面手機(jī)衛(wèi)士懸浮窗效果

    這篇文章主要介紹了Android仿360手機(jī)衛(wèi)士懸浮窗效果的桌面實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Android適配器(Adapter)的概念與自定義

    Android適配器(Adapter)的概念與自定義

    這篇文章主要給大家介紹了關(guān)于Android適配器(Adapter)的相關(guān)資料,適配器是一個(gè)非常重要的知識(shí)點(diǎn),Adapter是用來(lái)幫助填出數(shù)據(jù)的中間橋梁,本文介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07

最新評(píng)論