android下資料的持久化儲存
- 列表內容
- 資料持久化儲存有 檔案儲存(內建儲存,外接儲存(sd卡)), SharedPreference , 資料庫 , 伺服器儲存.
使用檔案 , SharedPreference 或資料庫來儲存資料會相對更簡單些,而且比起將資料儲存在 SD 卡中會更加的安全.
一 : 檔案儲存
1,將資料儲存到檔案中
Context 類中提供了一個openFileOutPut()方法,用於將資料儲存到指定的資料夾中.
openFileOutPut(name,mode) : 提供了兩個引數.
name: 檔案的名稱,檔案建立的時候指定的名稱,他所有的檔案都是預設儲存到/data/data//files/目錄下的.
mode: 檔案的操作模式.主要有兩種模式 :
MODE_PRIVATE : 預設的操作模式,當指定同樣的檔名的時候,所寫入的內容將會覆蓋原檔案中的內容.
MPDE_APPEND : 如果該檔案存在就往檔案裡面追加內容,不存在就建立.
其實檔案的操作模式本來還有兩種: 因為容易引起安全性漏洞,現在已在 Android 4.2 版本中被廢棄.
MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE : 允許其他的應用程式對我們程式中的檔案進行讀寫操作.
示例程式碼:
通過 openFileOutput()方法得到 FileOutputStream 物件,藉助 FileOutputStream構建出一個 OutputStreamWriter 物件,接著使用 OutputStreamWriter 構建出一個 BufferedWriter 物件, 藉助 BufferedWriter物件來將文字寫入到檔案中了
String s = getResources().getString(R.string.testData);
try {
data = openFileOutput(“data”, MODE_PRIVATE);
//new OutputStreamWriter(data) 把字元流轉換成位元組流 ,為了高效 使用bufferedWriter對其進行包裝
bufferedWriter = new BufferedWriter(new OutputStreamWriter(data));
bufferedWriter.write(s);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bufferedWriter!=null)
bufferedWriter.close();//不管操作成不成功,最終一定要關閉流,釋放資源
} catch (IOException e) {
e.printStackTrace();
}
}
2 , 從檔案 中讀取資料
讀取資料和儲存資料大差不離的.都是 Context 類中提供的另一個 openFileInput() 方法,用於從檔案讀取資料(但是要知道讀取的檔案的名稱).
openFileInput() 要比 openFileOutput() 簡單一些,它只接受一個引數,即要讀取的檔名,然後系統會自動到 /data/data//files/目錄下去載入這個檔案,並返回一個 FileInputStream 物件,得到這個物件之後再通過 java 流的方式就可以將資料讀取出來了
示例程式碼:
/**
* 讀取檔案
*
* @param fileName 檔名字
* @return 字串
*/
public String redData(String fileName) {
StringBuilder sb = null;
BufferedReader br = null;
try {
fis = openFileInput(fileName);
br = new BufferedReader(new InputStreamReader(fis));
sb = new StringBuilder();
String line = “”;
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
我們通過 openFileInput() 方法獲取到了一個 FileInputStream物件,然後藉助 FileInputStream 物件,接著在使用 InputStreamReader 構建出 BufferReader 物件,這樣就通過 BufferReader給讀取出來,在使用 StringBuilder 物件拼接,最後返回就可以了
- SharedPreferences 儲存、
不同與檔案的儲存方式, sharedPreferences 使用鍵值對的方式來儲存資料的.儲存一條資料的時候,需要給這條資料提供一個對應的鍵,這樣讀取資料的時候就可以通過鍵吧相應的值取出來. SharedPreferences 還支援儲存多種不同年的資料型別 儲存,儲存的是什麼型別的,取值的時候也要和儲存的型別是一樣的.
使用 SharedPreferences 來儲存資料,首先需要獲取到 SharedPreferences 物件. android 中主要提供了三種方法用於得到 SharedPreferences 物件.Context 類中的 getSharedPreferences() 方法
此方法接受兩個引數,第一個引數用於指定 SharedPreferences 檔案的名稱,如果指定的檔案不存在則會建立一個, SharedPreferences 檔案都是存放在 /data/data//shared_prefs/目錄下的.第二個引數用於指定操作模式,主要有兩種模式可以選擇, MODE_PRIVATE 和 MODE_MULTI_PROCESS. MODE_PRIVATE 仍然是預設的操作模式,和直接傳入 0 效果是相同的,表示只有當前的應用程式才可以對這個 SharedPreferences 檔案進行讀寫. MODE_MULTI_PROCESS 則一般是用於會有多個程序中對同一個 SharedPreferences 檔案進行讀寫的情況.類似的, MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 這兩種模式在 Android 4.2 版本中廢棄.Activity 類中的 getPreferences()
這個方法和 Context 中的 getSharedPreferences() 方法很相似,不過它只接受一個操作模式引數,使用這個方法會自動將當前活動的類名作為 SharedPreferences 的檔名.PreferenceManager 類中的 getDefaultSharedPreferences() 方法
這是一個靜態方法, 它就收一個 Context 引數,並自動使用當前應用程式的包名作為字首來命名 SharedPreferences 檔案. 得到 SharedPreferences 物件之後,就開始向 SharedPreferences 檔案中儲存資料了,主要分為三步實現:
1. 呼叫 SharedPreferences 物件的 edit() 方法來獲取一個 SharedPreferences.Editor 物件.
2. 向 SharedPreferences.Editor 物件中新增資料,比如新增一個布林型資料就使用 putBoolean() 方法,新增一個字串則使用 putString(),…
3.呼叫 commit() 方法將新增的資料提交,完成資料儲存操作
示例程式碼:
/**
* Created by feng on 2016/3/24.
* 在最好的年華,尋找最真的自己!
* 滿天星斗.我繼續前進.
*/
public class SharedPreferencesUtils {
private static final String FILE_NAME = “config”;
private static SharedPreferences mSharedPreferences;
private static Context mContext;
private SharedPreferencesUtils() {
this.mContext = new Application().getApplicationContext();
}
/**
* 通過Context獲取 SharedPreferences
*
* @param sharedName SharedPreferences 檔案的名稱
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances(String sharedName) {
if (mSharedPreferences == null) {
mSharedPreferences = mContext.getSharedPreferences(sharedName, Context.MODE_PRIVATE);
}
return mSharedPreferences;
}
/**
* 通過 PreferenceManager 獲取 SharedPreferences
* 會以當前的包名作為 SharedPreferences 檔案的名稱
*
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances() {
if (mSharedPreferences == null) {
mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
}
return mSharedPreferences;
}
/**
* 通過 Activity 獲取 SharedPreferences
*
* @param mode 檔案操作模式
* @return SharedPreferences
*/
public static synchronized SharedPreferences getSharedInstances(int mode) {
if (mSharedPreferences == null) {
mSharedPreferences = new Activity().getPreferences(mode);
}
return mSharedPreferences;
}
/**
* 儲存String型別的資料
*
* @param key 資料的鍵
* @param value 資料
*/
public static void setString(String key, String value) {
SharedPreferences.Editor edit = getSharedInstances().edit();
edit.putString(key, value);
edit.commit();
}
/**
* 獲取Shared 儲存的資料
*
* @param key 獲取資料的鍵
* @param dfvalue 預設的值
* @return 資料
*/
public static String getString(String key, String dfvalue) {
return mSharedPreferences.getString(key, dfvalue);
}
/**
* 以此類推
*/
}
4, SQLite資料儲存
SQLite 是 輕量級,獨立性,隔離性,跨平臺,多語言介面,安全性的資料儲存.
與 SQLite 資料庫相關的類
SQLiteOpenHelper 抽象類 : 通過繼承此類,重寫父類的方法,來建立和更新表.
SQLiteDatabase 資料庫訪問類:執行對資料庫的插入記錄、查詢記錄等操作
SQLiteCursor查詢結構操作類: 用來訪問查詢結果中的記錄 不過要用完要及時關閉
資料庫的資料型別都是 String 型別的.
建立資料陸庫的建立步驟:
1. 定以一個類繼承 SQLiteOpenHelper (資料庫幫助類 MyDataBaseOpenHelper )
2. 通過制定資料庫檔案的名稱,資料庫的版本號.預設的遊標工廠
3.通過 MyDataBaseOpenHelper 物件得到一個可寫或者是可讀的 資料庫.資料庫不存在就建立,存在就開啟
示例程式碼:
/**
* @param context 上下文
* @param name 資料庫名稱 以 .db 結尾
* @param factory 預設遊標工廠 從資料庫檔案的頭部開始
* @param version 資料庫的版本號 最小是1
*/
public MyDataBaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(“create table book(_id integer primary key autoincrement,author text ,price real, pagers integer,name text)”);
db.execSQL(“create table Category(_id integer primary key autoincrement,category_name text,category_code integer)”);
Log.i(TAG, “onCreate: 資料庫建立了”);
}
/**
* 更新資料庫
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(“drop table if exists book”);
db.execSQL(“drop table if exists Category”);
onCreate(db);
}
MyDataBaseOpenHelper myDataBaseOpenHelper = new MyDataBaseOpenHelper(this,”book.db”,null,2);
SQLiteDatabase writableDatabase = myDataBaseOpenHelper.getWritableDatabase();//這句話執行了資料才建立成功
5.伺服器儲存
未完待續!