Android五種資料儲存方式
資料儲存在開發中是使用最頻繁的,Android平臺中實現資料儲存主要有5種方式,分別是:
- SQLite: SQLite是一個輕量級嵌入式資料庫,支援基本SQL語法,是常被採用的一種資料儲存方式。Android為此資料庫提供了一個名為SQLiteDatabase的類,封裝了一些操作資料庫的API。
- SharedPreference:SharedPreferences也是一種輕型的資料儲存方式,它的本質是基於XML檔案儲存key-value鍵值對資料,通常用來儲存一些簡單的配置資訊。其儲存位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences物件本身只能讀取資料而不支援寫入資料,儲存修改是通過Editor物件實現。
- File: 即常說的檔案(I/O)儲存方法,常用語儲存大數量的資料,但是缺點是更新資料將是一件困難的事情。
- ContentProvider: Android系統中能實現所有應用程式共享的一種資料儲存方式,由於資料通常在各應用間的是互相私密的,所以此儲存方式較少使用,但是其又是必不可少的一種儲存方式。例如音訊,視訊,圖片和通訊錄,一般都可以採用此種方式進行儲存。每個Content Provider都會對外提供一個公共的URI(包裝成Uri物件),如果應用程式有資料需要共享時,就需要使用Content Provider為這些資料定義一個URI,然後其他的應用程式就通過Content Provider傳入這個URI來對資料進行操作。
- 網路儲存資料:通過網路獲取資料和寫入資料到網路儲存空間
小結:1~3只能用於工程內部
2、拓展
2.1 SQLite主要通過兩個類實現其功能
- SQLiteOpenHelper:資料庫的幫助類,是一個抽象類,定義有兩個抽象方法,用於進行資料庫和表的建立(onCreate(SQLiteDatabase db)),以及版本的更新(onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion))
- SQLiteDatabase:這個類裡封裝了對錶的具體的操作的方法,比如增刪改查(crud)的方法。
2.2 獲取SharedPreferences物件的方式:
- 呼叫Context物件的getSharedPreferences()方法,可指定file name和MODE
- 呼叫Activity物件的getPreferences()方法,只需指定MODE
- 每個應用有一個預設的偏好檔案preferences.xml,使用PreferceManager().getDefaultSharedPreferences()來獲取
前兩種方式的區別:
- 呼叫Context物件的getSharedPreferences()方法獲得的SharedPreferences物件可以被同一應用程式下的其他元件共享.
- 呼叫Activity物件的getPreferences()方法獲得的SharedPreferences物件只能在該Activity中使用.
2.3 SharedPreferences的四種操作模式:
- Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私有資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容
- Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案.
- Context.MODE_WORLD_READABLE用來控制其他應用是否有許可權讀該檔案.
- Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權寫該檔案.
MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;
MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入
2.4 SharedPreferences與SQLite資料庫的區別
SharedPreferences物件與SQLite資料庫相比,免去了建立資料庫,建立表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能儲存boolean,int,float,long和String五種簡單的資料型別,比如其無法進行條件查詢等。所以不論SharedPreferences的資料儲存操作是如何簡單,它也只能是儲存方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他資料儲存方式。
2.5 ContentProvider與SQLite的區別
Sql只能在該工程的內部共享資料,ContentProvider能在工程之間實現資料共享。
2.6 ContentProvider URI組成部分
- 標準的字首: ContentProvider(內容提供者)的scheme已經由Android所規定, scheme為:content://
- 唯一標識整個ContentProvider: 主機名(或叫Authority)用於唯一標識這個ContentProvider,外部呼叫者可以根據這個標識來找到它。
- 描述了資料的路徑,確定返回哪類資料: 路徑(path)可以用來表示我們要操作的資料,路徑的構建應根據業務而定
ID唯一標註請求的資料: 我們要請求資料的ID
2.7 通過contentResolver獲取ContentProvider內容的基本步驟
- 得到ContentResolver類物件:ContentResolver cr = getContentResolver();
- 定義要查詢的物件。
- 使用cr.query();返回一個Cursor物件。
- 使用while迴圈得到Cursor裡面的內容,並把查詢出來的資料放到對應的物件屬性裡。
- 關閉Cursor,返回查詢結果
ContentProvider負責組織應用程式的資料,向其他應用程式提供資料;
ContentResolver則負責獲取ContentProvider提供的資料,修改/新增/刪除更新資料等
2.8 自定義ContentProvider的步驟
- 繼承Android的ContentProvider基類實現自己的ContentProvider類。
- 實現 ContentProvider裡的onCreate方法,建立provider的資料,一般為資料庫sqlite。
- 重寫ContentProvider 中相應的insert/delete/update/query增刪改查這些方法。
- 在AndroidManifest.xml檔案中註冊該ContentProvider類,為ContentProvider指定Uri。Uri類似網頁訪問中使用的URL地址。
在<application></application>中配置 <provider/>標籤以及屬性:android:name屬性:ContentProvider的類名
android:authorities屬性:用於訪問ContentProvider的名稱。
2.9 Android中訪問自定義ContentProvider
通過ContentProvider的Uri訪問開放的資料。
1. ContenResolver物件通過Context提供的方法getContenResolver()來獲得。
2. ContenResolver提供了以下方法來操作:insert delete update query這些方法分別會呼叫ContenProvider中與之對應的方法並得到返回的結果。
2.10 ContentValues的使用
ContentValues 和HashTable類似都是一種儲存的機制 但是兩者最大的區別就在於,contenvalues只能儲存基本型別的資料,像string,int之類的,不能儲存物件這種東西,而HashTable卻可以儲存物件。
ContentValues需要配合各種儲存方式使用,完成對資料的增刪改