數據存儲

     Android 系統中主要提供了三種方式用於簡單地實現數據持久化功能,即文件存儲、SharedPreference 存儲以及數據庫存儲。除了這三種方式以外,你還能夠將數據保存在手機的 SD 卡中,不過使用文件、SharedPreference或數據庫來保存數據會相對更簡單一些,並且比起將數據保存在 SD 卡中會更加的安全。java

1文件存儲

文件存儲是 Android 中最基本的一種數據存儲方式,它不對存儲的內容進行任何的格式化處理,全部數據都是原封不動地保存到文件當中的,於是它比較適合用於存儲一些簡單的文本數據或二進制數據.android

1.1 將數據存儲到文件中

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>

 

2 SharePreferences存儲

2.1 獲得SharedPreferences 對象的3種方式

要想使用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 文件。

2.2 SharedPreferences存儲數據的步驟

一、 調用 SharedPreferences 對象的 edit()方法來獲取一個 SharedPreferences.Editor 對象。

二、向 SharedPreferences.Editor 對象中添加數據,好比添加一個布爾型數據就使用

putBoolean 方法,添加一個字符串則使用 putString()方法,以此類推。

三、調用 commit()方法將添加的數據提交,從而完成數據存儲操做。

3 SQLite 數據庫存儲

SQLite是一款輕量級的關係數據庫,它的運算速度很是快,佔用資源不多,一般只須要幾百K的內存就足夠呢,特別適合在移動設備上使用。SQLite不只支持標準的SQL語法,還遵循了數據庫的ACID事務。SQLite比通常的數據庫簡單得多,能夠不用設置用戶名和密碼就能使用。

ACID:指數據庫事務正確執行的四個基本要素的首字母縮寫。

  • 原子性(Atomicity):確保工做單位內的全部操做都成功完成,不然,事務會在出現故障時終止,以前的操做也會回滾到之前的狀態。

  • 一致性(Consistency):確保數據庫在成功提交的事務上正確地改變狀態。

  • 隔離性(Isolation):使事務操做相互獨立和透明。

  • 持久性(Durability):確保已提交事務的結果或效果在系統發生故障的狀況下仍然存在。

3.1 建立數據庫

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);
相關文章
相關標籤/搜索