Android開發(一)實現資料存放區技術

來源:互聯網
上載者:User

本文介紹Android中的5種資料存放區方式。

資料存放區在開發中是使用最頻繁的,在這裡主要介紹Android平台中實現資料存放區的5種方式,分別是:

1 使用SharedPreferences儲存資料

2 檔案儲存體資料

3 SQLite資料庫儲存資料

4 使用ContentProvider儲存資料

5 網路儲存資料

 

下面將為大家一一詳細介紹。

 

第一種: 使用SharedPreferences儲存資料

SharedPreferences是Android平台上一個輕量級的儲存類,主要是儲存一些常用的配置比如視窗狀態,一般在Activity中 重載視窗狀態onSaveInstanceState儲存一般使用SharedPreferences完成,它提供了Android平台常規的Long長 整形、Int整形、String字串型的儲存。 

 

它是什麼樣的處理方式呢? SharedPreferences類似過去Windows系統上的ini設定檔,但是它分為多種許可權,可以全域共用訪問,android123提示最終是以xml方式來儲存,整體效率來看不是特別的高,對於常規的輕量級而言比SQLite要好不少,如果真的儲存量不大可以考慮自己定義檔案格式。xml 處理時Dalvik會通過內建底層的本地XML Parser解析,比如XMLpull方式,這樣對於記憶體資源佔用比較好。

 

  它的本質是基於XML檔案儲存體key-value索引值對資料,通常用來儲存一些簡單的配置資訊。

其儲存位置在/data/data/<包名>/shared_prefs目錄下。

SharedPreferences對象本身只能擷取資料而不支援儲存和修改,儲存修改是通過Editor對象實現。

實現SharedPreferences儲存的步驟如下:   

一、根據Context擷取SharedPreferences對象   

二、利用edit()方法擷取Editor對象。   

三、通過EditorObject Storage Servicekey-value索引值對資料。   

四、通過commit()方法提交資料。

 

下面是範例程式碼: public  class MainActivity  extends Activity {    

 @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //擷取SharedPreferences對象
        Context ctx = MainActivity.this;       
        SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
        //存入資料
        Editor editor = sp.edit();
        editor.putString("STRING_KEY", "string");
        editor.putInt("INT_KEY", 0);
        editor.putBoolean("BOOLEAN_KEY", true);
        editor.commit();
        
        //返回STRING_KEY的值
        Log.d("SP", sp.getString("STRING_KEY", "none"));
        //如果NOT_EXIST不存在,則傳回值為"none"
        Log.d("SP", sp.getString("NOT_EXIST", "none"));
     }

}  


這段代碼執行過後,即在/data/data/com.test/shared_prefs目錄下產生了一個SP.xml檔案,一個應用可以建立多個這樣的xml檔案。 

 

SharedPreferences對象與SQLite資料庫相比,免去了建立資料庫,建立表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能儲存boolean,int,float,long和String五種簡單的資料類型,比如其無法進行條件查詢等。所以不論SharedPreferences的資料存放區操作是如何簡單,它也只能是儲存方式的一種補充,而無法完全替代如SQLite資料庫這樣的其他資料存放區方式。 

 

第二種: 檔案儲存體資料

關於檔案儲存體,Activity提供了openFileOutput()方法可以用於把資料輸出到檔案中,具體的實現過程與在J2SE環境中儲存資料到檔案中是一樣的。

檔案可用來存放大量資料,如文本、圖片、音頻等。

預設位置:/data/data/<包>/files/***.***。

 

程式碼範例:   public  void save()

 {

        try {
            FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
            outStream.write(text.getText().toString().getBytes());
            outStream.close();
            Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            return;
        }
        catch (IOException e){
            return ;
        }

 } 

     

openFileOutput()方法的第一參數用於指定檔案名稱,不能包含路徑分隔字元“/” ,如果檔案不存在,Android 會自動建立它。

建立的檔案儲存在/data/data/<package name>/files目錄,如: /data/data/cn.itcast.action/files/itcast.txt ,通過點擊Eclipse菜單“Window”-“Show View”-“Other”,在交談視窗中展開android檔案夾,選擇下面的File Explorer視圖,然後在File Explorer視圖中展開/data/data/<package name>/files目錄就可以看到該檔案。

 

openFileOutput()方法的第二參數用於指定操作模式,有四種模式,分別為:

Context.MODE_PRIVATE = 0

Context.MODE_APPEND = 32768

Context.MODE_WORLD_READABLE = 1

Context.MODE_WORLD_WRITEABLE = 2

Context.MODE_PRIVATE:為預設操作模式,代表該檔案是私人資料,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原檔案的內容,如果想把新寫入的內容追加到原檔案中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式會檢查檔案是否存在,存在就往檔案追加內容,否則就建立新檔案。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該檔案。

MODE_WORLD_READABLE:表示當前檔案可以被其他應用讀取;

MODE_WORLD_WRITEABLE:表示當前檔案可以被其他應用寫入。

 

如果希望檔案被其他應用讀和寫,可以傳入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,當應用程式(.apk)在安裝時系統就會分配給他一個userid,當該應用要去訪問其他資源比如檔案的時候,就需要userid匹配。預設情況下,任何應用建立的檔案,sharedpreferences,資料庫都應該是私人的(位於/data/data/<package name>/files),其他程式無法訪問。

除非在建立時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有這樣其他程式才能正確訪問。

讀取檔案樣本: public  void load()
{
     try {
        FileInputStream inStream= this.openFileInput("a.txt");
        ByteArrayOutputStream stream= new ByteArrayOutputStream();
         byte[] buffer= new  byte[1024];
         int length=-1;

while((length=inStream.read(buffer))!=-1)   {
            stream.write(buffer,0,length);
        }

        stream.close();
        inStream.close();
        text.setText(stream.toString());
        Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
    } catch (FileNotFoundException e) {
        e.printStackTrace()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.