學習筆記| AS入門(七) 數據存儲篇

一個好的開發平臺要對數據的存儲有良好的支持,而不是僅靠保存在內存中的瞬時數據。本篇主要介紹Android平臺實現數據存儲的三種方式,分別是:

  • File 文件存儲
  • SharedPreferences存儲
  • SQLite數據庫存儲

在分別介紹之前,先要知道以上三種方法使得數據文件都默認存儲在哪裏,方便後續驗證,如圖:

另外,關於如何在DDMS裏File Explore下打開data文件夾以及導出文件在技能篇有詳細說明,本篇不再贅述,驗證時將直接展示導出文件內容。

1.File文件存儲

在Android中寫入和讀取文件的方法,和 Java中實現I/O的程序是一樣的,Context類中提供了openFileInput()和openFileOutput()方法來打開數據文件裏的文件IO流。下面直接通過一個demo學習Android如何通過文件來保存數據。

(1)寫入數據

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

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

關鍵方法:

  FileOutputStream fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
                bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                bufferedWriter.write(text);

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

運行程序,在輸入框裏輸入Hello AS!然後退出程序。

查看DDMS,果然有data文件!導出後內容和輸入完全一致,證實了內容確實成功保存到文件了。

(2)讀取數據

接下來我們想讓程序再次啓動時輸入框內已經顯示剛剛寫入的數據。在OnCreate()中用openFileInput()方法指定了要從文件data中讀取數據,之後代碼和寫入是對應的非常好理解。讀取到內容之後判斷是否爲空,若不爲空,就set到EditText裏,並調用setSelection 方法將輸入光標移動到文本的末尾位置以便於繼續輸入,再彈出一句重新加載成功的提示。

關鍵方法:

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

運行程序,效果如圖:

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,這裏做一個登陸界面,如下圖所示。相信這樣的一個頁面難不倒你,佈局嵌套就能實現了。

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

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

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

最後再回到MainActivity的onCreate()方法中,下面這段代碼的含義是:當用戶選中複選框並且成功登陸一次之後,那麼MyPres文件裏肯定有數據了,這時如果重啓登陸界面,SharedPreferences就會獲取文件中數據並且呈現在輸入框裏了;當沒有數據說明第一次打開界面或者用戶不需要記住密碼功能就什麼也不需要顯示了。

運行程序,測試一下:

並且記住密碼功能也能很好的實現,這裏就不展示了。如果用戶選中複選框那麼MyPres文件裏就有數據了,見下圖:

3.SQLite數據庫存儲

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

(1)創建數據庫

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

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

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

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

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

在主活動裏獲取所有按鈕實例並註冊點擊事件,在onCreate()實例化幫助類MyHelper,指定數據庫名爲student.db,版本號爲1。ContentValues類先跳過。

接下來實現點擊創建按鈕的效果:調用getReadableDatabase()創建數據庫,且MyHelper的onCreate()也會執行,那麼student表也被建立了。

運行程序,點擊創建有Toast提示!但這不代表student表建立成功。所以到DDMS下找文件,確實有student.db數據庫,但想要查看它需要別的工具,所以換一種查看方式,用adb shell來檢查,命令如下:

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

(2)增加數據

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

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

運行程序,數據確實插入成功!

(3)刪除數據

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

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

(4)更改數據

update() 方法提供四個參數,(表名,ContentValues對象,約束,約束),之前都學過了!來試試給表裏唯一的學生Lucy的年級更改爲高三:

更改成功!

(5)查詢數據

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

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

打印出的日誌結果如圖:

(6)升級數據庫

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

修改版本號爲2:

重新運行程序,點擊創建,student表不會再創建而只會創建course表!

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

數據持久化技術就學習到這裏~

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章