1. 程式人生 > >Android基礎(十一)----持久化技術

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中
  1. 獲取一個SharedPreferences物件。------------------------------------------------------------------------------------------------------------------可以通過三種方法獲取SharedPreferences物件:                                                                                                            (一)Context類中的getSharedPreferences(String name,int mode)方法,第一個引數是儲存的檔名,檔案路徑為預設,               第二個引數是指定操作模式,一般選擇MODE_PRIVATE。                                                                                          (二)Activity類中的getPreferences(int mode)方法,自動將當前活動的類名作為SharedPreferences的檔名。        (三)PreferenceManager類中的getDefaultSharedPreferences(Context context)方法,靜態方法,自動使用當前應用程式的包名作為字首來命名SharedPreferences檔案。
  2. 呼叫SharedPreferences物件的edit()方法獲取SharedPreferences.Editor物件。
  3. 通過put方法向SharedPreferences.Editor物件中新增資料
  4. 呼叫apply()方法將新增的資料提交,從而完成資料儲存操作
  • 從SharedPreferences中讀取資料
  1. 新建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是開源庫,首先需要要宣告開源庫的引用,基本有兩種做法:
  1. 直接在bulid.gradle檔案中新增外部依賴 
    cpmpile 'org.litepal.android:core:1.4.1'
  2. 將相應的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();即可建立一張表