1. 程式人生 > >android下資料的持久化儲存

android下資料的持久化儲存

  1. 列表內容
  2. 資料持久化儲存有 檔案儲存(內建儲存,外接儲存(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 物件.

    1. 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 版本中廢棄.

    2. Activity 類中的 getPreferences()
      這個方法和 Context 中的 getSharedPreferences() 方法很相似,不過它只接受一個操作模式引數,使用這個方法會自動將當前活動的類名作為 SharedPreferences 的檔名.

    3. 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.伺服器儲存
未完待續!