學習筆記|AS入門(七) 資料儲存篇

釐米姑娘發表於2017-12-21

一個好的開發平臺要對資料的儲存有良好的支援,而不是僅靠儲存在記憶體中的瞬時資料。本篇主要介紹Android平臺實現資料儲存的三種方式,分別是:

  • File 檔案儲存
  • SharedPreferences儲存
  • SQLite資料庫儲存

在分別介紹之前,先要知道以上三種方法使得資料檔案都預設儲存在哪裡,方便後續驗證,如圖:

學習筆記|AS入門(七) 資料儲存篇

另外,關於如何在DDMS裡File Explore下開啟data資料夾以及匯出檔案在技能篇有詳細說明,本篇不再贅述,驗證時將直接展示匯出檔案內容。

1.File檔案儲存

在Android中寫入和讀取檔案的方法,和 Java中實現I/O的程式是一樣的,Context類中提供了openFileInput()和openFileOutput()方法來開啟資料檔案裡的檔案IO流。下面直接通過一個demo學習Android如何通過檔案來儲存資料。

(1)寫入資料

新建佈局mylayout.xml,只加入一個EditText用於輸入文字內容:

學習筆記|AS入門(七) 資料儲存篇

新建MyActivity,在onCreate()獲取EditText例項,然後重寫onDestory()為了在活動銷燬之前將輸入的文字內容儲存起來。具體方法是:先獲取了EditText中輸入的文字text,然後openFileOutput()方法將text儲存到名為data的檔案中並且能夠得到一個FileOutputStream 物件,,再借助它構建出一 個OutputStreamWriter物件,接著再使用OutputStreamWriter 構建出一個 BufferedWriter 物件,這樣就可以通過BufferedWriter來將文字內容寫入到檔案中了。

學習筆記|AS入門(七) 資料儲存篇

關鍵方法:

  FileOutputStream fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
                bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                bufferedWriter.write(text);
複製程式碼

這裡強調openFileOutput()方法裡第兩個引數,表示是檔案的操作模式,常用的可選值含義見下圖:

學習筆記|AS入門(七) 資料儲存篇

執行程式,在輸入框裡輸入Hello AS!然後退出程式。

學習筆記|AS入門(七) 資料儲存篇

檢視DDMS,果然有data檔案!匯出後內容和輸入完全一致,證實了內容確實成功儲存到檔案了。

學習筆記|AS入門(七) 資料儲存篇

(2)讀取資料

接下來我們想讓程式再次啟動時輸入框內已經顯示剛剛寫入的資料。在OnCreate()中用* openFileInput()* 方法指定了要從檔案data中讀取資料,之後程式碼和寫入是對應的非常好理解。讀取到內容之後判斷是否為空,若不為空,就set到EditText裡,並呼叫setSelection 方法將輸入游標移動到文字的末尾位置以便於繼續輸入,再彈出一句重新載入成功的提示。

學習筆記|AS入門(七) 資料儲存篇

關鍵方法:

 FileInputStream fileInputStream=openFileInput("data");
            bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            String line;
            while((line=bufferedReader.readLine())!=null){
                content.append(line);
            }
複製程式碼

執行程式,效果如圖:

學習筆記|AS入門(七) 資料儲存篇

2.SharePreferences儲存

SharePreferences是一種輕型的資料儲存方式,常用來儲存一些簡單的配置資訊,如int、string、boolean、float和long。它的本質是基於XML檔案儲存key-value鍵值對資料。

實現SharedPreferences儲存的步驟如下: (1)呼叫 getSharedPreferences() 方法獲得SharedPreferences物件,提供兩個引數,指定檔名和操作模式。 (2)呼叫SharedPreference物件的 edit() 方法獲得SharedPreferences.Editor引用物件 (3)呼叫Edit介面的形如 put某某某() 方法以鍵值對形式儲存 某某某 型別的資料 (4)呼叫Edit介面的 commit() 方法提交鍵值對。 一定注意,不用SharedPreferences物件去儲存或修改資料,而是通過Editor物件。但獲取資料時需要呼叫SharedPreferences物件的 get某某某() 方法了。

學習完SharePreferences基本知識點後,通過一個有記住密碼功能的demo來鞏固一下吧!新建login.xml,這裡做一個登陸介面,如下圖所示。相信這樣的一個頁面難不倒你,佈局巢狀就能實現了。

學習筆記|AS入門(七) 資料儲存篇

在MainActvity的onCreate()裡先獲取除了TextView的所有控制元件、例項化SharedPreferences和SharedPreferences.Editor、給兩個按鈕都註冊擊事件,程式碼如下:

學習筆記|AS入門(七) 資料儲存篇

再來看看點選事件,當點選cancel時,直接finish()結束當前活動;當點選login時,第一輪判斷使用者名稱和密碼是否對應(假設只有一個賬戶),如果不對應就彈出提示登陸不成功,如果對應就提示登陸成功並跳轉到另一個頁面,在跳轉之前要進行第二輪判斷以保證資料不丟失,判斷CheckBox是否選中,如果未選中就用Edit清除所有資料,如果選中就新增使用者名稱和密碼,注意最後一定要commit提交。

學習筆記|AS入門(七) 資料儲存篇

下兩個圖就是跳轉頁面的佈局和活動了。

學習筆記|AS入門(七) 資料儲存篇

學習筆記|AS入門(七) 資料儲存篇

最後再回到MainActivity的onCreate()方法中,下面這段程式碼的含義是:當使用者選中核取方塊並且成功登陸一次之後,那麼MyPres檔案裡肯定有資料了,這時如果重啟登陸介面,SharedPreferences就會獲取檔案中資料並且呈現在輸入框裡了;當沒有資料說明第一次開啟介面或者使用者不需要記住密碼功能就什麼也不需要顯示了。

學習筆記|AS入門(七) 資料儲存篇

執行程式,測試一下:

學習筆記|AS入門(七) 資料儲存篇

並且記住密碼功能也能很好的實現,這裡就不展示了。如果使用者選中核取方塊那麼MyPres檔案裡就有資料了,見下圖:

學習筆記|AS入門(七) 資料儲存篇

3.SQLite資料庫儲存

SQLite是一款輕量級的關係型資料庫,它的運算速度非常快,佔用資源很少,在儲存大量複雜的關係型資料的時可以使用,比前面學過的只適用於儲存簡單資料的兩種儲存方式要好很多。接下來學習如何建立、升級資料庫以及對資料進行增刪改查,並穿插一個完整的例子更好的掌握這些知識點。

(1)建立資料庫

先學習一個類SQLiteOpenHelper,它是SQLiteDatabase的幫助類, 用於管理資料庫的建立和升級。SQLiteOpenHelper的使用步驟:

第一步:自定義幫助類並繼承SQLiteOpenHelper,並重寫兩個方法:**onCreate()**和 onUpgrade(),分別在這兩個方法中去實現建立、升級資料庫的邏輯。還需要一個構造方法,這裡用含有四個引數的構造方法就可以,如圖:

學習筆記|AS入門(七) 資料儲存篇

第二步:建立資料庫時,先例項化一個自定義的幫助類,並提供四個引數,含義是(上下文,資料庫名,建立Cursor的工廠類,版本號)。 第三步:用幫助類物件的 getReadableDatabase()getWritableDatabase() 去建立或開啟一個現有的資料庫(如果資料庫已存在則直接開啟,否則建立一個新的資料庫),並返回一個可對資料庫 SQLiteDatabase 。 第四步:之後就可以利用得到的資料庫進行增刪改查的操作了。

下面就來做個demo吧!從自定義幫助類開始,並重寫兩個方法及建構函式。在這裡用幫助類幫助建立一個student表,包含學生的學號、姓名、年齡和年級,對應的SQL語句就放在一個字串常量裡。特別要注意語句一定要準確,多個空格都會建表失敗。在onCreate()方法裡會返回一個SQLiteDatabase物件,接下來終於接觸到SQLiteDatabase的第一個常用方法execSQL(),這個方法非常萬能,它可接受和處理SQL語句,換句話說,後面將要學習的增刪改查不僅可以用提供好的現成的輔助性方法,還可直接用原生SQL語句再呼叫execSQL()就夠了,在後面的學習中只介紹前一種方法。這裡就呼叫execSQL()去建立表並列印一行提示的Toast。一個自定義幫助類構建好了!

學習筆記|AS入門(七) 資料儲存篇

然後新建佈局,並放入五個按鈕,對應建立和增刪改查:

學習筆記|AS入門(七) 資料儲存篇

在主活動裡獲取所有按鈕例項並註冊點選事件,在onCreate()例項化幫助類MyHelper,指定資料庫名為student.db,版本號為1。ContentValues類先跳過。

學習筆記|AS入門(七) 資料儲存篇

接下來實現點選建立按鈕的效果:呼叫getReadableDatabase()建立資料庫,且MyHelper的onCreate()也會執行,那麼student表也被建立了。

學習筆記|AS入門(七) 資料儲存篇

執行程式,點選建立有Toast提示!但這不代表student表建立成功。所以到DDMS下找檔案,確實有student.db資料庫,但想要檢視它需要別的工具,所以換一種檢視方式,用adb shell來檢查,命令如下:

學習筆記|AS入門(七) 資料儲存篇

可以證實student表成功建立了!

(2)增加資料

現在學習之前看到的ContentValues類,常用它 put() 方法以鍵值對的形式儲存基本型別資料。在增和改會用到它,可以理解為鍵就是表中屬性名,值就是表中資料。還常用方法 clear() 清空所有資料。

再來學習SQLiteDatabase用於增添資料的輔助性方法 insert() ,三個引數含義(被操作的表名,空值欄位的名稱,資料即ContentValues物件),第二個引數一般傳入null。學會之後給student表插入兩行記錄吧,因為id這個屬性設定了自增長所以可以不用管它:

學習筆記|AS入門(七) 資料儲存篇

執行程式,資料確實插入成功!

學習筆記|AS入門(七) 資料儲存篇

(3)刪除資料

刪除資料的輔助性方法是delete(),第一個引數還是表示表名,第二第三個引數用於約束刪除某一行或幾行的資料。比如需要刪除student表中年齡大於17的記錄:

學習筆記|AS入門(七) 資料儲存篇

執行,發現表中第二條記錄果然被刪除了!

學習筆記|AS入門(七) 資料儲存篇

(4)更改資料

update() 方法提供四個引數,(表名,ContentValues物件,約束,約束),之前都學過了!來試試給表裡唯一的學生Lucy的年級更改為高三:

學習筆記|AS入門(七) 資料儲存篇

更改成功!

學習筆記|AS入門(七) 資料儲存篇

(5)查詢資料

查詢方法 quary() 複雜一些,需要至少七個引數(table, columns, selection, selectionArgs, groupBy, having, orderBy),含義是:(表名,要查詢出的列名,查詢條件子句,對應於selection語句中佔位符的值,要分組的列名,分組後過濾條件,排序方式)。其實也不用害怕,多數情況下少數幾個引數就能完成查詢操作了。

還沒完,這個方法會返回一個Cursor,查詢到的資料都會從它取出。Cursor常用方法: moveToFirst() 將指標移動到結果集的第一行; getColumnIndex() 獲取某一列在表中對應位置的索引; get某某某() 傳入索引以獲取相應位置的某種型別的資料; close() 關閉指標。下面來查詢student表中所有資料:

學習筆記|AS入門(七) 資料儲存篇

列印出的日誌結果如圖:

學習筆記|AS入門(七) 資料儲存篇

(6)升級資料庫

MyHelper裡需要重寫的第二個方法 onUpdate() 用於幫助資料庫進行版本更新。比如此刻需要在資料庫再新增一張表course,只要在update()寫好建立course的操作,然後想辦法讓它被呼叫就好了。還記得在例項化幫助類是需要傳入的第四個引數版本號嗎?之前的傳入的是1,只要傳入一個比1大的數就可以讓update()執行了。在下圖程式碼裡利用了 oldVersion 去判斷舊版本號,如果是1就只需要再建course表,如果初次執行程式,就只會執行onCreate()方法然後兩張表就一起建立了。這樣做的好處是無論更新到第幾代都不會影響之前的運算元據,也能保證當前版本是最新的。

學習筆記|AS入門(七) 資料儲存篇

修改版本號為2:

學習筆記|AS入門(七) 資料儲存篇

重新執行程式,點選建立,student表不會再建立而只會建立course表!

學習筆記|AS入門(七) 資料儲存篇

補充閱讀:Litepal是一個輕型的資料庫操作框架,採用了物件關係對映的模式,並對常用的資料庫操作進行了封裝,使用它會方便很多。感興趣可見:專案主頁使用方法.

資料持久化技術就學習到這裡~

> 下一篇預告:元件篇之ContentProvider

相關文章