Android 系統中主要提供了三種方式用於簡單地實現數據持久化功能,即文件存儲、SharedPreference 存儲以及數據庫存儲。除了這三種方式以外,你還能夠將數據保存在手機的 SD 卡中,不過使用文件、SharedPreference或數據庫來保存數據會相對更簡單一些,並且比起將數據保存在 SD 卡中會更加的安全。java
文件存儲是 Android 中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式化處理,全部數據都是原封不動地保存到文件當中的,於是它比較適合用於存儲一些簡單的文本數據或二進制數據.android
Context 類中提供了一個 openFileOutput (arg1,arg2)方法.sql
arg1, 文件名,在文件建立時使用到這個名稱。不能夠包含路徑。數據庫
arg2,文件的操做模式。主要有兩種模式可選,MODE_PRIVATE 和 MODE_APPEND. 安全
MODE_PRIVATE是默認的操做模式,表示當指定一樣文件名的時候,所寫入的內容將會覆蓋原文件的內容app
MODE_APPEND則表示若是文件已存在就往文件裏面追加內容,不存在就建立新文件。ide
openFileOutput ()方法返回的是一個 FileOutputStream 對象,獲得了這個對象以後就可使用 Java 流的方式將數據寫入到文件中了。全部文件都默認存儲在到 %ANR_ADB%/data/<package name>/files目錄下。ui
package qhy.store; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText edit ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) findViewById(R.id.edit); String inputText = load(); if( !TextUtils.isEmpty( inputText ) ){ edit.setText( inputText ); edit.setSelection( inputText.length() ); Toast.makeText(this, "Restoring succeeded", Toast.LENGTH_LONG).show(); } } @Override protected void onDestroy() { super.onDestroy(); String input = edit.getText().toString(); save(input); } public void save(String input) { try(FileOutputStream out = openFileOutput("data", Context.MODE_PRIVATE) ; BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)) ; ){ writer.write(input); Log.d("ok", "success"); } catch (IOException e) { e.printStackTrace(); } } public String load(){ StringBuilder content = new StringBuilder(); try(FileInputStream in = openFileInput("data"); BufferedReader reader = new BufferedReader(new InputStreamReader(in))){ String line = ""; while( (line=reader.readLine())!=null ){ content.append(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }; return content.toString(); } }
在activity_main.xml中的代碼this
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint_string"/> </LinearLayout>
在strings.xml中的代碼spa
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">文件存儲</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="hint_string">Type something here</string> </resources>
要想使用SharedPreferences來存儲數據, 首先須要獲取到SharedPreferences對象。 Android中主要提供了三種方法用於獲得 SharedPreferences 對象。
一、Context類中的getSharedPreferences(arg1 , arg2)方法
arg1 : SharedPreferences文件的名稱,若是指定文件不存在則會建立一個,SharedPreferences文件都是存放在/data/data/<package_name>/shared_prefs/目錄下的。
arg2:操做模式,主要有兩種操做模式,MODE_PRIVATE和MODE_MULT_PROCESS.
MODE_PRIVATE 默認操做模式,和直接傳入0效果相同,表示只有當前應用程序才能夠對這個
SharedPreferences文件進行讀寫的狀況。
MODE_MULTI_PROCESS:通常是用於會有多個進程中對同一個SharedPreferences文件進行讀寫的狀況。
二、Activity 類中getPreferences( arg )方法
arg : 操做模式參數, SharedPreferences 的文件名:當前活動的類名.
三、PreferenceManager 類中的 getDefaultSharedPreferences()方法
這是一個靜態方法,它接收一個 Context 參數,並自動使用當前應用程序的包名做
爲前綴來命名 SharedPreferences 文件。
一、 調用 SharedPreferences 對象的 edit()方法來獲取一個 SharedPreferences.Editor 對象。
二、向 SharedPreferences.Editor 對象中添加數據,好比添加一個布爾型數據就使用
putBoolean 方法,添加一個字符串則使用 putString()方法,以此類推。
三、調用 commit()方法將添加的數據提交,從而完成數據存儲操做。
SQLite是一款輕量級的關係數據庫,它的運算速度很是快,佔用資源不多,一般只須要幾百K的內存就足夠呢,特別適合在移動設備上使用。SQLite不只支持標準的SQL語法,還遵循了數據庫的ACID事務。SQLite比通常的數據庫簡單得多,能夠不用設置用戶名和密碼就能使用。
ACID:指數據庫事務正確執行的四個基本要素的首字母縮寫。
原子性(Atomicity):確保工做單位內的全部操做都成功完成,不然,事務會在出現故障時終止,以前的操做也會回滾到之前的狀態。
一致性(Consistency):確保數據庫在成功提交的事務上正確地改變狀態。
隔離性(Isolation):使事務操做相互獨立和透明。
持久性(Durability):確保已提交事務的結果或效果在系統發生故障的狀況下仍然存在。
Android爲了讓咱們可以更加方便地管理數據庫,專門提供了一個SQLiteOpenHelper幫助類,藉助這個類就能夠很是簡單地對數據庫進行建立和升級。
SQLiteOpenHelper是一個抽象類,有兩個抽象方法onCreate與onUpgrade().分別實現建立、升級數據庫的邏輯。
SQLiteOpenHelper中有兩個很是重要的實例方法,getReadableDatabase() 和 getWritableDatabase() 。 這兩個方法均可以建立或打開一個現有的數據庫,並返回一個隊數據庫進行讀寫操做的對象。當數據庫不可寫入時(如磁盤空間已滿)getReadableDatabase()方法返回的對象將以只讀的方式打開數據庫,而getWritableDatabase()方法將出現異常。
數據庫文件會存放在:/data/data/<package name>/databases/ 目錄下 , 只能看見數據庫文件。爲看見數據庫下面的表結構,須要把Android SDK下的platform-tools放到環境變量中。
SQLite 的數據類型:integer 表示整型,real表示浮點型,text表示文本型,blob表示二進制類型。autoincrement表示自增加。
新增數據:
SQLiteDatabase db = dbHelper.getWritableDatabase();//dbHelper是SQLiteOpenHelper的子類 ContentValues values = new ContentValues(); // 開始組裝第一條數據 values.put("name", "The Da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", 454); values.put("price", 16.96); db.insert("Book", null, values); // 插入第一條數據 values.clear(); // 開始組裝第二條數據 values.put("name", "The Lost Symbol"); values.put("author", "Dan Brown"); values.put("pages", 510); values.put("price", 19.95); db.insert("Book", null, values); //
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99","The Da Vinci Code" });
更新數據:
SQLiteDatabase db = dbHelper.getWritableDatabase(); //arg1: 表名; arg2:sql語句中where後的條件; arg3:其後的條件 db.delete("Book", "pages > ?", new String[] { "500" });
db.execSQL("delete from Book where pages > ?", new String[] { "500" });
查詢數據:
SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("book", null, null, null, null, null, null); if( cursor.moveToFirst() ){ do{ String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); }while(cursor.moveToNext()); } cursor.close();
db.rawQuery("select * from Book", null);