Android基礎(十一)----持久化技術
Android持久化技術:檔案儲存、SharedPreferences儲存,資料庫儲存以及SD卡外部儲存。
檔案儲存:(簡單資料)
- 將資料檔案儲存到檔案中
Context類提供了openFileOutput(String name, int mode)方法,可以將資料儲存在指定檔案中。第一個引數是檔名,儲存路徑是預設的(/date/date/<packagename>/files/目錄下);第二個引數是檔案的操作模式,MODE_PRIVATE(預設操作模式,指定的檔名會覆蓋原檔案中的內容)和MODE_APPEND(會在原有的檔案基礎上在後面追加)。
openFileOutput()方法返回一個FIleOutputStream物件,通過該物件構建出一個OutputStreamWriter物件, 通過該物件再構建出一個BufferedWriter物件,通過BufferedWriter物件的write(String str)方法將內容寫入到指定檔案中。
FIleOutputStream---OutputStreamWriter---BufferedWriter---write()方法寫入資料
- 從檔案中讀取資料
Context類提供了openFileInput(String name)方法,從檔案中讀取資料。引數為讀取資料的檔名
openFileInput(String name)方法返回一個FileInputStream物件,通過該物件構建一個InputStreamReader物件,通過該物件再構建出一個BufferedReader物件,通過BufferedReader物件的read()或readLine()方法讀取檔案中的內容。
FIleInputStream---InputStreamReader---BufferedReader---readLine()方法讀入資料
TextUtils.isEmpty()方法,對字串進行非空判斷(null和空字串)。
TextView控制元件物件的setSelection(int i)方法,將輸入游標移動到指定位置。
SharedPreferences儲存:
- 將資料儲存到SharedPreferences中
- 獲取一個SharedPreferences物件。------------------------------------------------------------------------------------------------------------------可以通過三種方法獲取SharedPreferences物件: (一)Context類中的getSharedPreferences(String name,int mode)方法,第一個引數是儲存的檔名,檔案路徑為預設, 第二個引數是指定操作模式,一般選擇MODE_PRIVATE。 (二)Activity類中的getPreferences(int mode)方法,自動將當前活動的類名作為SharedPreferences的檔名。 (三)PreferenceManager類中的getDefaultSharedPreferences(Context context)方法,靜態方法,自動使用當前應用程式的包名作為字首來命名SharedPreferences檔案。
- 呼叫SharedPreferences物件的edit()方法獲取SharedPreferences.Editor物件。
- 通過put方法向SharedPreferences.Editor物件中新增資料
- 呼叫apply()方法將新增的資料提交,從而完成資料儲存操作
- 從SharedPreferences中讀取資料
- 新建SharedPreferences物件,直接呼叫該物件的get方法,需要將鍵值傳遞進去,並附預設值。
SQLite資料庫儲存:
Android提供了一個SQLiteOpenHelper幫助類,藉助這個類就可以對SQLite資料庫進行建立和升級了。
SQLiteOpenHelper是一個抽象類,需要自定義類去繼承該抽象類,同時需要重寫onCreate()、onUpgrade()兩個抽象方法。這兩個方法提供建立和升級資料庫的邏輯。
SQLiteOpenHelper中還提供兩個重要的例項方法:getReadableDatabase()和getWritableDatabase()。這兩個方法可以建立或開啟一個現有的資料庫,並返回一個可對資料庫進行讀寫操作的物件。當磁碟已滿時,getReadableDatabase()方法返回一個只讀物件,而getWritableDatabase()方法將會出現異常。
SQLiteOpenHelper提供兩個構造方法,其中一個構造方法需要提供四個引數,第一個引數是Context物件,第二個引數是資料庫名,第三個引數是允許在查詢資料時候返回一個自定義的Cursor,一般是傳入null;第四個引數代表當前資料庫的版本號。
- 升級資料庫
當有新表需要建立時,需要在自定義類中重寫onUpgrade()方法,在該方法中進行更新表操作。而在主活動中呼叫該方法是通過更改建構函式中的版本號進行呼叫onUpgrade()方法。
- 新增資料
SQLiteOpenHelper類的getReadableDatabase()或getWritableDatabase()方法返回一個SQLiteDatabase物件,藉助該物件可以完成新增資料操作。SQLiteDatabase物件的insert(String table, String nullColumHack, ContentValues values)方法,第一個引數是表的名字,第二個引數是自動給為空的列自動賦值NULL,第三個引數是一個ContentValues物件,該物件提供了一系列put()方法用於過載。
- 更新資料
SQLiteDatabase物件的update(String table,ContentValues values,String whereClause,String[] whereArgs),第一個引數是表名;第二個引數是ContentValues物件,要把更新資料在這裡組裝進去;第三第四個引數用於約束更新某一行或某幾行中的資料,不進行指定的話就預設更新所有行。
- 刪除資料
SQLiteDatabase物件的delete(String table, String whereClause, String[] whereAgrs)方法,第一個引數是表名,第二、第三個引數是用於約束刪除某一行或者某幾行的資料,預設刪除所有行
- 查詢資料
SQLiteDatabase物件的query(String table, String[] columns, String selection, String[] selectionArgs,String groupBy, String having, String orderBy),第一個引數是表名;第二個引數是用於指定查詢那幾列,不指定則預設查詢所有行的資料;第三、第四個引數用於約束查詢某一行或某幾行的資料,不指定則預設查詢所有行的資料;第五個引數用於指定需要去group by的列,不指定表示不進行group by操作;第六個引數對group by之後的資料進行進一步的過濾操作,不指定代表不進行;第七個引數指定查詢結果的排序方式,不指定表示使用預設的排序方式。
使用LitePal操作資料庫:
- 由於LitePal是開源庫,首先需要要宣告開源庫的引用,基本有兩種做法:
- 直接在bulid.gradle檔案中新增外部依賴
cpmpile 'org.litepal.android:core:1.4.1'
- 將相應的jar下載到本地,然後新增本地依賴,參看下面這篇部落格http://www.cnblogs.com/landiljy/p/6881851.html。基本的操作步驟就是將jar包拷貝至app/lib下,然後右鍵Add As Library即可。
- 在新增完相關引用後,需要配置litepal.xml檔案,其中<dbname>標籤用於指定資料庫版本號,<list>標籤用於指定所有的對映模型。
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
<dbname value = "BookStore" ></dbname>
<version value = "1"></version>
<list></list>
</litepal>
- 通過物件關係對映(ORM)模式來建立表,將建立好的類通過<list>標籤中的<mapping>標籤來宣告要配置的對映模型類,使用完整的類名進行對映。最後在活動中通過呼叫LitePal.getDatabase();即可建立一張表