Android 資料儲存

1 篇文章 / 0 new
author
Android 資料儲存

一.資料儲存方式
在Android內要保存資料,有以下幾種方式可以選擇

1.SharedPreferences
    以key-value方式儲存只有Private data
2.Internal Storage
    使用device內部的記憶體儲存Private data
3.External Storage
    使用如SD卡這樣的外部儲存媒介,儲存Public data
4.SQLite Databases
    以資料庫結構儲存private data
5.Network Connection
    儲存資料到網路主機上
對於Private Data,在Android利用 Content Providers Class來作存取

二.SharedPreferences
利用 SharedPreferences Class可以將基本型別的資料(boolean,string,float,int..)以key-value方式作存取,data會持續保留在user session,即使app被砍了,資料還是保留著

1.取得SharedPreferences的兩種方式
1.需要用到多個Preference的狀況
  getSharedPreferences(name):如果需要用到多個
  preference file儲存,利用name來取得
  例:
  SharedPreferences settings = Context.getSharedPreferences("myPre", 0);
2.只需要用到一個Preference
  Activity.getPreferences(int mode):如果你的Activity
  只會用到一個preference

2.寫入preference的流程
1.呼叫edit()取得SharedPreferences.Editor
    SharedPreferences settings = getSharedPreferences("myPre", 0);
    SharedPreferences.Editor editor = settings.edit();
2.利用以下method把值寫入putBoolean() and putString()
    editor.putString("myStr", "strValue");
3.使用commit()把改變的資料真正寫入
    editor.commit();

3.讀取Preference值
使用SharedPreferences的getBoolean()、getString()等method
String str = settings.getString("myStr","defaultStr");

4.範例
public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";
 
    @Override
    protected void onCreate(Bundle state){         
       super.onCreate(state);
       . . .
       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }
 
    @Override
    protected void onStop(){
       super.onStop();
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);
      editor.commit();
    }
}

三.Internal Storage
你可以把資料直接儲存在device的內存,預設儲存在內存的檔案是只有該App可讀取,其他App無法讀取,當App移除時,這資料會一併被移除

1.在內存產生一個private file,寫入資料流程
1.提供一個檔案名稱來呼叫openFileOutput(name)
  取得FileOutputStream物件(Context的method)
2.FileOutputStream物件使用write()寫入資料    
3.FileOutputStream物件使用close()關閉檔案


String FILENAME = "hello_file";
String string = "hello world!";
 
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
範例裡的參數MODE_PRIVATE是指當有同名檔案會自動覆蓋

2.由內存讀取檔案資料
1.提供檔名呼叫openFileInput(name)來取得
  FileInputStream物件
2.FileInputStream物件使用read()讀取bytes資料
3.FileInputStream物件使用close()關閉

3.使用暫存
若只是暫存資料,而不是永久存檔可以利用getCacheDir()來取得一個File物件當作暫存檔,當系統內存不足時,這些cacheFile就會被刪除,使用暫存檔需要自己時時去清理

4.其他method
1.getFilesDir()
    取得內存在檔案系統的目錄絕對路徑
2.getDir()
    在內存空間建立目錄或開啟已存在目錄
3.deleteFile()
    刪除內存檔案
4.fileList()
    取得目前App在內存所儲存的檔案清單Array

四.External Storage
所有Android相容device均支援利用外部儲存裝置來儲存檔案(如SD卡),使用者利用USB即可將資料傳輸到電腦內

1.檢查外存媒介是否存在
在使用外存之前都需先用getExternalStorageState()檢查外存媒介是否存在


String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
    //可以對media作讀寫
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    //只可以對media作讀取
} else {
    //無法作讀寫
}

2.讀取外存檔案
1.API level8
  使用 Context.getExternalFilesDir(String type)取得一個目錄的File物件,這method的type參數,是指定子目錄的類型,如DIRECTORY_MUSIC,
  DIRECTORY_RINGTONES或傳入null 取得App root目錄,再透過File取得檔案,如果檔案已經存在則會打開該檔案。利用這method可直接建立目錄,
  當App移除時,目錄會跟著移除    
 
  例
  File path=Context.getExternalFilesDir(null);
  File file=new File(path,"mypic.jpg")    
2.API Level 7以下版本    
  則用Environment.getExternalStorageDirectory()取得根目錄的 File物件,也就是讀取的資料會是在 /Android/data/package_name/files/目錄下
  package_name是如同 com.example.android.app 的名稱
 
  例
  File path=Environment.getExternalStorageDirectory()
  File file=new File(path,"mypic.jpg")


3.儲存檔案
若要儲存檔案,不指定給特定App用,且希望在App移除時檔案不被刪除,請儲存到外存上的 Music/, Pictures/, Ringtones/等目錄

1.API Level 8
  使用Context.getExternalStoragePublicDirectory(String type) 取得目錄的File物件。這method的type參數,設定值為DIRECTORY_MUSIC,
  DIRECTORY_PICTURES ,DIRECTORY_RINGTONES,如果目錄不存在,會自動產生
 
  例
  File path=Context.getExternalFilesDir(null);
  File file=new File(path,"mypic.jpg")
2.API Level 7 以下版本
  使用Environment.getExternalStorageDirectory()取得根目錄的
  File物件。儲存的資料會是在以下的目錄
 
  Music/ - media scanner會掃描這裡找音樂檔
  Podcasts/ - media scanner會掃描這裡找podcast.
  Ringtones/ - media scanner會掃描這裡找音樂手機檔鈴聲.
  Alarms/ - media scanner會掃描這裡找alarm sound.
  Notifications/ - media scanner會掃描這裡找notification sound.
  Pictures/ - 所有照片包括相機拍的都在這裡.
  Movies/ - 所有影片包括相機拍的都在這裡.
  Download/ - 其他下載檔案.
 
  例
  File rootPath=Environment.getExternalStorageDirectory();
  File path=new File( rootPath.getParent() + "/Music" );
  File file=new File(path,"my.mp3")  


4.使用暫存
1.API Level 8
  使用getExternalCacheDir() 開啟cache File,當App被移除時,檔案也會被自動移除,但在App還在的狀態下,使用者要自己管理暫存避免空間不足
2.API Level 7以下版本
  使用getExternalStorageDirectory()開啟cache File,檔案會被放在/Android/data/package_name/cache/目錄下

from http://ozzysun.blogspot.tw/2010/11/android.html
Free Web Hosting