標籤:
一、
使用檔案進行資料存放區
1.context.openFileOutput()方法 寫入檔案內容 在上下文context中 openFileOutput方法可以用於把資料輸出到檔案中 範例程式碼: public static void fileStorage(Context context){ try { FileOutputStream fos = context.openFileOutput("filedata.txt", context.MODE_PRIVATE); fos.write("檔案儲存體".getBytes()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } openFileOutput()方法 的第一個參數用於指定檔案名稱,不能包含路徑分隔字元“/”,如果檔案不存在,會自動建立,建立的檔案儲存在/data/data/包名/files目錄下 如:/data/data/cn.itcast/files/itcast.txtopenFIleOutput()方法的第二個參數用於指定操作模式,有四種模式,分別為: Context.MODE_PRIVATE = 0Context.MODE_APPEND = 32768Context.MODE_WORLD_READABLE = 1Context.MODE_WORLD_WRITEABLE = 2 Context.MODE-PRIVATE:為預設操作模式,代表該檔案是私人資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到源檔案中,可以使用Context.MODE_APPEND Context.MODE-APPEND: 模式會檢查檔案是否存在,存在就往檔案中追加內容,否則就建立檔案 Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案 Context.MODE_WORLD_READABLE: 表示當前檔案可以被其他應用程式讀取 Context.MODE_WORLD_WRITERABLE: 表示當前檔案可以被其他應用寫入 如果希望檔案被其他應用程式讀和寫,可以傳入: openFileOutput("filestorage.text",Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); Android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源時,如訪檔案的時候,就需要userid匹配。 預設情況下,任何應用建立的檔案,sharepreferences,資料庫都應該是私人的(位於/data/data/包名/files),其他程式無法訪問。除非在建立時指定了Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE,只有這樣其他程式才能正確訪問。
2.讀取檔案內容 如果開啟存放在/data/data/包名/files目錄應用私人的檔案,可以使用Activity提供的openFileInput()方法 FileInputStream fis = context.openFileInput("fileStorage2.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String data = br.readLine(); System.out.println("data:" + data); 或者直接使用該檔案的絕對路徑: File file = new File("/data/data/包名/files/檔案名稱"): FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String data = br.readLine(); System.out.println("data:" + data); 對於私人檔案只能被建立該檔案的應用訪問,如果希望檔案能被其他應用讀和寫,可以在建立檔案時,指定Context.MODE_WORLD_READABLE 和 Context.MODE_WORLD_WRITERABLEz許可權 Activity還提供了getCacheDir() 和 getFileDir()方法 getCacheDir()方法 用於擷取 /data/data/包名/cache目錄 ----- 擷取緩衝資訊 getFileDir()方法 用於擷取/data/data/包名/files目錄 ==================================================================================
二、檔案儲存體在SDCard
1.儲存到SDCard 使用Activityd openFileOutput()方法儲存檔案,檔案是存放在手機空間上,一般手機的儲存孔家不是很大,存放寫小檔案還好,但一般不能存放大檔案,如視頻等 在模擬器中使用SDCard,你需要先建立一個具有SDCard的模擬器 在程式中訪問SDCard,你需要申請訪問SDCard的許可權。 //
掛在和卸載SDCard的許可權 android.premission.MOUNT_UNMOUNT_FILESTSTEMS //
寫入外部存放裝置的許可權 android.permission. WRITE_EXTERNAL_STORAGE
要往SDCard存放檔案,程式必須先檢驗手機是否有SDCard的存在,並且可以進行讀寫。
注意:訪問SDCard必須在AndroidManifest.xml中加入訪問SDCard的許可權 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ // 判斷是否有sd卡 Environment.getExternalStorageState()方法用於擷取SDCard的狀態, // 如果手機裝有SDCard,並且可以進行讀寫,那麼方法返回的狀態等於Environment.MEDIA_MOUNTED。 File sdCardDir = Environment.getExternalStorageDirectory(); // 獲得sdCard卡的路徑 File file = new File(sdCardDir,"sdCardStorage.txt"); try { if(!file.exists()){ // 如果檔案不存在 則建立該檔案 file.createNewFile(); } FileOutputStream fos = new FileOutputStream(file); fos.write("SD卡儲存".getBytes()); fos.flush(); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }
2.從SDCard中取出資料
添加從SDCard中取出資料的許可權 : android.permission.READ_EXTERNAL_STORAGE
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
// 判斷記憶卡是否存在
File sdCardDir = Environment.getExternalStorageDirectory();
File file = new File(sdCardDir,"sdCardStorage.txt");
try {
FileInputStream fis = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
String data = br.readLine();
System.out.println("data:" + data);
fis.close();
br.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} ==================================================================================
三、使用SharedPreferences進行資料存放區
1.儲存資料
SharedPreferences類,是一個輕量級儲存類,特別適合用於儲存軟體配置參數。使用SharedPreferences儲存資料,其實質上是用xml檔案存放資料,檔案存放在/data/data/包名/shared_prefs目錄下 常用來儲存:qq登入資訊,簡單的配置資訊,狀態,標識等。 SharedPreferences sp = context.getSharedPreferences("sharedPre", context.MODE_PRIVATE); Editor editor = sp.edit(); // 獲得編輯器 editor.putString("spStorage", "SharedPreferences方式儲存資料"); editor.commit(); // 提交 產生的xml檔案如下: <?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?> <map> <string name="spStorage">SharedPreferences方式儲存資料</string> </map> 因為SharedPreferences背後是使用xml檔案儲存資料,getSharedPreferences(name,mode)方法的第一個參數用於指定該檔案的名稱,名稱後面不用帶尾碼.xml,尾碼由Android自動加上。方法的第二個參數指定檔案的操作模式,共有四種操作模式,即是前面所寫的那四種模式。 如果希望SharedPreferences背後使用的xml檔案能被其他應用程式讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE許可權。 另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方法預設使用當前類不帶包名的類名作為檔案的名稱。
2.訪問SharedPreferences 中的資料
SharedPreferences sp = context.getSharedPreferences("sharedPre", context.MODE_PRIVATE); String data = sp.getString("spStorage", null); System.out.println("data:" + data); sp.getString(key, defValue);方法 第一個參數是鍵key,根據key尋找對應的值value,如果沒找到,則返回第二個參數defValue(預設值) 四、Sqlite資料庫儲存 Sqlite 是一款輕型的資料庫,是遵守ACID(原子性、一致性、隔離性、持久性)的關聯式資料庫管理系統,多用於嵌入式開發中。 Sqlite的資料類型:Typelessness(物類型),可以儲存任何類型的資料到你所想要儲存的任何錶的任何列中,但它又支援常見的類型如:NULL,VARCHAR,TEXT,INTEGER,BLOG,CLOB....等等,唯一例外的是:integer primary key 此欄位只能儲存64為整數 在Android系統中,提供了SQLiteOpenHelper抽象類別,該類用於對資料庫版本進行管理,該類中常用的方法: onCreate 資料庫建立時調用此方法(第一次串連擷取資料庫物件時執行) onUpgrade 資料庫更新時調用此方法(版本號碼改變時執行) onOpen 資料庫每次開啟時執行(每次開啟資料庫時調用哦,在onCreate、onUpgrade方法之後
1.使用SQLiteDatabase操作SQLite資料庫 Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作資料庫的API,使用該類可以完成對資料的添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete),這些操作簡稱為(
CRUD) execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法用於執行select語句(查詢query)。 SQLiteOpenHelper抽象類別: public class MySqliteOpenHelper extends SQLiteOpenHelper { public MySqliteOpenHelper(Context context) { super(context, "database.db", null, 1); } /** * 資料庫建立時調用 */ @Override public void onCreate(SQLiteDatabase db) { String sql = "create table database (_id integer primary key autoincrement,name varchar(20),age varchar(20))"; db.execSQL(sql); } /** * 資料庫更新時調用 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } } 資料庫的增刪改查操作: /** * 資料庫協助類 */ private MySqliteOpenHelper helper; public DatabaseUtils(Context context){ helper = new MySqliteOpenHelper(context); } /** * 將資料插入資料庫 */ public void insert(){ SQLiteDatabase db = helper.getWritableDatabase(); String sql = "insert into database values(null,‘zhangsan‘,‘20‘)"; db.execSQL(sql); db.close(); } /** * 更新資料庫中的資料 */ public void update(){ SQLiteDatabase db = helper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "lisi"); db.update("database", values, "name = ?", new String []{"zhangsan"}); db.close(); } /** * 查詢資料庫 中的資料 */ public void query(){ SQLiteDatabase db = helper.getReadableDatabase(); String sql = "select name,age from database"; Cursor cursor = db.rawQuery(sql, null); while(cursor != null && cursor.moveToNext()){ // cursor 不為null 防止出現null 指標異常 moveToNext ()移動到下一行 String name = cursor.getString(0); // 獲得第一列的值,第一列的索引從0開始 int age = cursor.getInt(1); // 獲得第二類的值 System.out.println("name : " + name + "," + "age :" + age); } cursor.close(); db.close(); } /** * 刪除資料庫中的資料 */ public void delete(){ SQLiteDatabase db = helper.getWritableDatabase(); db.delete("database", null, null); db.close(); } Cursor是結果集遊標,用於對結果集進行隨機訪問,與jdbc中的ResultSet作用很相似。使用moveToNext()方法可以將遊標從當前行移動到下一行,如果已經移到了最後吧一行,返回結果為false,否則為true。另外Cursor還用常用的moveToPrevious()方法(用於將遊標從當前行移動到上一行,如果已經移動到了結果集的第一行,傳回值為false,否則為true)、moveToFirst()方法(用於將遊標移動到結果集的第一行,如果結果集為空白,傳回值為false,否則為true)和moveToLast()方法(用於將遊標移動到結果集的最後一行,如果結果集為空白,傳回值為false,否則為true);
使用事務操作Sqlite資料庫
SQLiteDatabase db = null;
try {
db = helper.getWritableDatabase();
db.beginTransaction(); // 開啟事務
String sql = "insert into database values(null,‘zhangsan‘,‘20‘)";
db.execSQL(sql);
db.execSQL("update database set name=? where age=?", new Object[]{"wangwu", 20});
db.setTransactionSuccessful(); // 調用此方法會在執行到endTransaction()方法時提交當前事務,如果不調用此方法會復原事務
}finally{
if(db != null){
db.endTransaction(); // 事務的結束的標誌,決定是提交事務還是復原事務
}
}
db.close(); 使用SQLiteDatabase的beginTransaction()方法可以開啟一個事務,程式執行到endTransaction()方法時會檢查事務的標誌是否成功,如果程式執行到endTransaction()方法之前調用了setTransactionSuccessful()方法設定事務的標誌為成功,則提交事務,如果沒有調用setTransactionSuccessful()方法則復原事務
Android學習筆記 --- 資料存放區與訪問 (File,sdcard,sharedpreferences,sqlite)