1.File文件存儲git
在Android中寫入和讀取文件的方法,和 Java中實現I/O的程序是同樣的,Context類中提供了openFileInput()和openFileOutput()方法來打開數據文件裏的文件IO流。下面直接經過一個demo學習Android如何經過文件來保存數據。github
(1)寫入數據shell
新建佈局mylayout.xml,只加入一個EditText用於輸入文本內容:數據庫
新建MyActivity,在onCreate()獲取EditText實例,而後重寫onDestory()爲了在活動銷燬以前將輸入的文本內容存儲起來。具體方法是:先獲取了EditText中輸入的文本text,而後openFileOutput()方法將text存儲到名爲data的文件中而且可以獲得一個FileOutputStream 對象,,再借助它構建出一 個OutputStreamWriter對象,接着再使用OutputStreamWriter 構建出一個 BufferedWriter 對象,這樣就能夠經過BufferedWriter來將文本內容寫入到文件中了。bash
關鍵方法:app
FileOutputStream fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
bufferedWriter.write(text);
複製代碼
這裏強調openFileOutput()方法裏第兩個參數,表示是文件的操做模式,經常使用的可選值含義見下圖:框架
運行程序,在輸入框裏輸入Hello AS!而後退出程序。ide
查看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裏須要重寫的第二個方法 onUpdate() 用於幫助數據庫進行版本更新。好比此刻須要在數據庫再添加一張表course,只要在update()寫好建立course的操做,而後想辦法讓它被調用就行了。還記得在實例化幫助類是須要傳入的第四個參數版本號嗎?以前的傳入的是1,只要傳入一個比1大的數就可讓update()執行了。在下圖代碼裏利用了 oldVersion 去判斷舊版本號,若是是1就只須要再建course表,若是初次運行程序,就只會執行onCreate()方法而後兩張表就一塊兒創建了。這樣作的好處是不管更新到第幾代都不會影響以前的操做數據,也能保證當前版本是最新的。
修改版本號爲2:
從新運行程序,點擊建立,student表不會再建立而只會建立course表!
補充閱讀:Litepal是一個輕型的數據庫操做框架,採用了對象關係映射的模式,並對經常使用的數據庫操做進行了封裝,使用它會方便不少。感興趣可見:項目主頁,使用方法.
數據持久化技術就學習到這裏~
> 下一篇預告:組件篇之ContentProvider