Android學習筆記 --- 資料存放區與訪問 (File,sdcard,sharedpreferences,sqlite)

來源:互聯網
上載者:User

標籤:

一、 使用檔案進行資料存放區      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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.