1. SQLiteDatabase
操作SQLite數據庫的類。可以執行SQL語句,對數據庫進行增、刪、查、改的操作。也可以進行transaction的控制。很多類對數據庫的操作最終都是通過SQLiteDatabase實例來調用執行的。
需要注意的是,數據庫對於一個應用來說是私有的,並且在一個應用當中,數據庫的名字也是惟一的。
2. SQLiteOpenHelper
創建數據庫和數據庫版本管理的輔助類。這是一個抽象類,所以我們一般都有一個SQLiteOpenHelper子類,需要繼承實現
· void onCreate(SQLiteDatabase db)
在數據庫第一次生成的時候會調用這個方法,一般我們在這個方法裡邊生成數據庫表。
· void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
當數據庫需要升級的時候,Android系統會主動的調用這個方法。一般我們在這個方法裡邊刪除數據表,並建立新的數據表,當然是否還需要做其他的操作,完全取決於應用的需求。
而void onOpen(SQLiteDatabase db) 則可以選擇重寫。同時此類還有3個synchronized方法:void close(),SQLiteDatabase getReadableDatabase(),SQLiteDatabase getWritableDatabase()。
3. Cursor
游標。要注意這是一個接口。但很多時候我不需要知道它具體是哪個子類,直接按照API Doc裡面提供的方法調用就行了。通過Cursor 我們可以對從數據庫查詢出來的結果集進行隨機的讀寫訪問。對於數據庫的查詢結果,一般是由子類SQLiteCursor返回的。
4. ContentProvider
因為在Android系統裡面,數據庫是私有的。一般情況下外部應用程序是沒有權限讀取其他應用程序的數據。
如果你想公開你自己的數據,你有兩個選擇:你可以創建你自己的內容提供器(一個ContentProvider子類)或者你可以給已有的提供器添加數據-如果存在一個控制同樣類型數據的內容提供器且你擁有寫的權限。而外界根本看不到,也不用看到這個應用暴露的數據在應用當中是如何存儲的,或者是用數據庫存儲還是用文件存儲,還是通過網上獲得,這些一切都不重要,重要的是外界可以通過這一套標准及統一的接口和程序裡的數據打交道,可以讀取程序的數據,也可以刪除程序的數據,當然,中間也會涉及一些權限的問題。
而以下方法是需要在子類實現的:
· boolean onCreate() Called when the provider is being started.
· Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) 通過Uri進行查詢,返回一個Cursor。
· Uri insert(Uri url, ContentValues values) 將一組數據插入到Uri 指定的地方,返回新inserted的URI。
· int update(Uri uri, ContentValues values, String where, String[] selectionArgs) 更新Uri指定位置的數據,返回所影響的行數。
· int delete(Uri url, String where, String[] selectionArgs) 刪除指定Uri並且符合一定條件的數據,返回所影響的行數。
· String getType (Uri uri) 獲取所查詢URI的MIME類型,如果沒有類型則返回null。
當我們不需要把數據提供給第三方應用程序使用的話,可以不實現Content Provider。
5. ContentResolver
外界的程序通過ContentResolver接口可以訪問ContentProvider提供的數據,在Activity當中通過getContentResolver()可以得到當前應用的 ContentResolver實例。ContentResolver提供的接口和ContentProvider中需要實現的接口對應,具體可以查看API Doc,不過可以發現ContentResolver裡面的方法很多都是final或者static的。在實際應用中,我們很少實現ContentResolver抽象類,更多時候通過getContentResolver()從一個Activity或其它應用程序組件的實現裡獲取一個ContentResolver:
ContentResolver cr = getContentResolver();
然後你可以使用這個ContentResolver的方法來和你感興趣的任何內容提供器交互。
當初始化一個查詢時,Android系統識別查詢目標的內容提供器並確保它正在運行。系統實例化所有的ContentProvider對象;你從來不需要自己做。事實上,你從來不會直接處理ContentProvider對象。通常,對於每個類型的ContentProvider只有一個簡單的實例。但它能夠和不同應用程序和進程中的多個ContentProvider對象通訊。進程間的交互通過ContentResolver和ContentProvider類處理。
6. URI的說明
每個Content Provider都需要公開一個URI來標識它的數據集。一個控制多個數據集(多個表)的Content Provider為每一個數據集暴露一個單獨的URI。而URIs都以字符串"content://"開始。這個content:形式表明了這個數據正被一個Content Provider控制著。
圖片
將其分為A,B,C,D 4個部分:
A:標准前綴,用來說明一個Content Provider控制這些數據,無法改變的;
B:URI的權限部分,它定義了是哪個Content Provider提供這些數據。對於第三方應用程序,為了保證URI標識的唯一性,它必須是一個完整的、小寫的 類名。這個標識在<provider> 元素的 authorities屬性中說明:
- <provider name=".TransportationProvider"
- authorities="com.example.transportationprovider"
- . . . >
C:用來判斷請求數據類型的路徑。Content Provider使用這些路徑來確定當前需要生什麼類型的數據。這可以是0或多個段長。如果內容提供器只暴露了一種數據類型(比如,只有火車),這個分段可以沒有。如果提供器暴露若干類型,包括子類型,那它可以是多個分段長-例如,提供"land/bus", "land/train", "sea/ship", 和"sea/submarine"這4個可能的值。
D:被請求的特定記錄的ID。如果URI中包含,表示需要獲取的記錄的ID;如果沒有ID,就表示返回全部,這個分段和尾部的斜線會被忽略;
現在應該明白ContentResolver是通過URI來查詢ContentProvider中提供的數據。除了URI以外,還必須知道需要獲取的數據段的名稱,以及此數據段的數據類型。如果你需要獲取一個特定的記錄,你就必須知道當前記錄的ID,也就是URI中D部分。
現在我們來創建一個ContentProvider。按照官方的說法,“要創建一個內容提供器,你必須:
· 建立一個保存數據的系統。大多數Content Provider使用Android的文件儲存方法或SQLite數據庫來存放它們的數據,但是你可以用任何你想要的方式來存放數據。
實現SQLiteOpenHelper類來幫助你創建一個數據庫以及SQLiteDatabase類來管理它。
·
擴展ContentProvider類來提供數據訪問接口。
·
在清單manifest文件中為你的應用程序聲明這個Content Provider(AndroidManifest.xml)。”
1.設計好一個實體類,定義好需要公開的變量,column,URI等
2.創建內部類實現SQLiteOpenHelper,用於創建更新數據表,以及後面的獲取SQLiteDatabase引用
3.編寫ContentProvider子類或者其他封裝數據庫操作的自定義類,包含上面的內部類
4.在AndroidManifest.xml的application element裡面添加子element provider (和element activity同一層),聲明這個Content Provider