偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

谷歌官方文檔:Android API之?dāng)?shù)據(jù)儲(chǔ)存

移動(dòng)開發(fā) Android
本文將簡(jiǎn)述Android API的數(shù)據(jù)儲(chǔ)存 (Data Storage)工作機(jī)制,希望本文能對(duì)正在做Android開發(fā)的朋友有所幫助。

本文將簡(jiǎn)述Android API的數(shù)據(jù)儲(chǔ)存 (Data Storage)工作機(jī)制,希望本文能對(duì)正在做Android開發(fā)的朋友有所幫助。

數(shù)據(jù)儲(chǔ)存 (Data Storage)

Android為你提供了多個(gè)可選的方式來(lái)保存持久的應(yīng)用數(shù)據(jù)。你可以基于特定的需求來(lái)選擇解決方案,例如數(shù)據(jù)是否應(yīng)該是你的應(yīng)用私有的還是對(duì)其他應(yīng)用(和用戶)公開的以及你的數(shù)據(jù)需要多大的空間來(lái)儲(chǔ)存。

你可選的數(shù)據(jù)儲(chǔ)存方式如下:

◆Shared Preferences    共享偏好

以"鍵-值對(duì)"的形式儲(chǔ)存私有的基礎(chǔ)數(shù)據(jù)。

◆Internal Storage   內(nèi)部存儲(chǔ)器

儲(chǔ)存私有數(shù)據(jù)到設(shè)備內(nèi)存。

◆External Storage   外部存儲(chǔ)器

儲(chǔ)存公有數(shù)據(jù)到共享的外部?jī)?chǔ)存器。

◆SQLite Databases   SQLite數(shù)據(jù)庫(kù)

用一個(gè)私有的數(shù)據(jù)庫(kù)儲(chǔ)存結(jié)構(gòu)化數(shù)據(jù)。

◆Network Connection   網(wǎng)絡(luò)連接

通過(guò)你自己的服務(wù)器儲(chǔ)存數(shù)據(jù)到網(wǎng)絡(luò)。

Android為你提供了一個(gè)途徑來(lái)暴露你私有數(shù)據(jù)給其他的應(yīng)用程序 —— 通過(guò)一個(gè)content provider 。一個(gè)content provider是一個(gè)可選組件,暴露你的應(yīng)用程序數(shù)據(jù)的read/write接口,遵循任何可能引入的約定。更多關(guān)于content provider使用的信息,請(qǐng)查閱Content Providers 文檔.

使用Shared Preferences (Using Shared Preferences)

SharedPreferences 類提供了一個(gè)通用的框架來(lái)允許你以"鍵-值對(duì)"的形式來(lái)儲(chǔ)存和獲取持久的基礎(chǔ)數(shù)據(jù)。你可以使用SharedPreferences 來(lái)保存任何基礎(chǔ)數(shù)據(jù):boolean, float, int, long和String。這些數(shù)據(jù)將存留橫跨用戶對(duì)話(即使你的應(yīng)用程序被殺死了)。

 User Preferences
Shared preferences are not strictly for saving "user preferences," such as what ringtone a user has chosen. If you're interested in creating user preferences for your application, see PreferenceActivity
, which provides an Activity framework for you to create user preferences, which will be automatically persisted (using shared preferences).

要給你的應(yīng)用獲取一個(gè)SharedPreference 對(duì)象,使用以下的兩個(gè)函數(shù)之一:

getSharedPreferences() - 如果你需要多個(gè)通過(guò)名字來(lái)識(shí)別的偏好文件請(qǐng)使用該函數(shù),名字通過(guò)***個(gè)參數(shù)來(lái)設(shè)定。

getPreferences() - 如果你的Activity僅需要一個(gè)偏好文件請(qǐng)使用該函數(shù)。因?yàn)檫@會(huì)是你的Activity獨(dú)有的偏好文件,你不用提供一個(gè)文件名。

寫入數(shù)值:

1.調(diào)用edit() 函數(shù)來(lái)獲得一個(gè)SharedPreferences.Editor 對(duì)象。

2.通過(guò)putBoolean() 、putString() 等函數(shù)來(lái)添加數(shù)值。

3.通過(guò)commit() 函數(shù)來(lái)提交和確認(rèn)操作。

要讀取數(shù)值,使用SharedPreferences 中的getBoolean() 、getString() 等函數(shù)。

這里是一個(gè)例子,為一個(gè)計(jì)算器的按鍵靜音模式保存了一個(gè)偏好:

Java代碼

  1. public class Calc extends Activity {    
  2.     
  3.     public static final String PREFS_NAME = "MyPrefsFile";    
  4.     
  5.     @Override    
  6.     protected void onCreate(Bundle state) {    
  7.         super.onCreate(state);    
  8.          . . .    
  9.         // Restore preferences    
  10.         SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);    
  11.         boolean silent = settings.getBoolean("silentMode", false);    
  12.         setSilent(silent);    
  13.     }    
  14.     
  15.     @Override    
  16.     protected void onStop() {    
  17.         super.onStop();    
  18.         // We need an Editor object to make preference changes.    
  19.         // All objects are from android.context.Context    
  20.         SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);    
  21.         SharedPreferences.Editor editor = settings.edit();    
  22.         editor.putBoolean("silentMode", mSilentMode);    
  23.         // Commit the edits!    
  24.         editor.commit();    
  25.     }    
  26. }   

使用內(nèi)部存儲(chǔ)器 (Using the Internal Storage)

你可以直接將文件保存到設(shè)備的內(nèi)部存儲(chǔ)器上。默認(rèn)的,保存到內(nèi)部存儲(chǔ)器上的文件是對(duì)你的應(yīng)用私有的并且其他應(yīng)用無(wú)法訪問(wèn)它們(用戶也不行)。當(dāng)用戶卸載你的應(yīng)用,這些文件會(huì)被移除。
 
要?jiǎng)?chuàng)建和寫入一個(gè)私有文件到內(nèi)部存儲(chǔ)器:

1.通過(guò)文件名和處理模式調(diào)用openFileOutput() 函數(shù)。返回的是一個(gè)FileOutputStream 對(duì)象。

2.使用write() 函數(shù)來(lái)寫入文件。

3.使用close() 函數(shù)來(lái)關(guān)閉流。

For example:

Java代碼 

  1. String FILENAME = "hello_file";    
  2. String string = "hello world!";    
  3. FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);    
  4. fos.write(string.getBytes());    
  5. fos.close();    

MODE_PRIVATE 會(huì)創(chuàng)建文件并使它對(duì)你的應(yīng)用私有。其他可用的模式有:MODE_APPEND 、MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。

要從內(nèi)部存儲(chǔ)器中讀取一個(gè)文件:

1.調(diào)用openFileInput() 函數(shù)并傳遞一個(gè)文件名來(lái)讀取。返回的是一個(gè)FileInputStream 對(duì)象。

2.使用read() 函數(shù)讀取文件中的字節(jié)。

3.然后使用close() 函數(shù)關(guān)閉流。

提示 :如果你希望在編譯的時(shí)候保存一個(gè)靜態(tài)的文件到你的應(yīng)用中,將文件保存到你項(xiàng)目的res/raw/   目錄下。你使用openRawResource() 函數(shù)可以打開它,傳遞一個(gè)R.raw.<filename> 資源ID。該函數(shù)返回一個(gè)你可以用來(lái)讀取文件的InputStream 對(duì)象(但你無(wú)法改寫原始文件)。

保存緩存文件 (Saving cache files)

如果你想緩存一些數(shù)據(jù),而不是***儲(chǔ)存,你應(yīng)該使用getCacheDir() 來(lái)打開一個(gè)代表內(nèi)部存儲(chǔ)器中儲(chǔ)存臨時(shí)緩存文件的目錄的File 對(duì)象。

當(dāng)設(shè)備的內(nèi)部?jī)?chǔ)存空間較低時(shí),Android可能會(huì)刪除這些緩存文件來(lái)取回空間。無(wú)論如何,你不應(yīng)該依靠系統(tǒng)來(lái)為你清空這些文件。你應(yīng)該始終自己來(lái)維護(hù)緩存文件并維持在一個(gè)合理的空間消耗,比如1MB。當(dāng)用戶卸載你的應(yīng)用,這些文件會(huì)被移除。

其他有用的函數(shù) (Other useful methods)

◆getFilesDir()

獲取你的內(nèi)部文件所儲(chǔ)存的系統(tǒng)目錄的絕對(duì)路徑。

◆getDir()

在你的內(nèi)部存儲(chǔ)器空間中創(chuàng)建(或打開一個(gè)存在的)目錄。

◆deleteFile()

刪除一個(gè)保存在內(nèi)部存儲(chǔ)器上的文件。

◆fileList()

返回一個(gè)你的應(yīng)用當(dāng)前保存了的文件的數(shù)組。#p#

使用外部存儲(chǔ)器 (Using the External Storage)

每個(gè)兼容Android的設(shè)備都支持一個(gè)共享的"外部存儲(chǔ)器",你可以用它來(lái)儲(chǔ)存文件。這可以是可被移除的存儲(chǔ)媒介(例如一個(gè)SD卡)或是一個(gè)內(nèi)部存儲(chǔ)器 (不可被移除)。儲(chǔ)存在外部存儲(chǔ)器中的文件都是world-readable屬性并且可以被用戶修改(當(dāng)他們?cè)试SUSB大儲(chǔ)存器在電腦上轉(zhuǎn)移文件時(shí))。

 警告 :里面的這些外部文件是會(huì)消失不可見的——如果用戶把外部存儲(chǔ)器掛在到一臺(tái)電腦上或移除該媒介(SD卡),同時(shí)你儲(chǔ)存在外部?jī)?chǔ)存器上的文件沒有強(qiáng)制的安全保證。所有應(yīng)用程式都可以讀寫這些文件并且用戶也可以刪除它們。

檢測(cè)媒介是否可用 (Checking media availability)

在你對(duì)外部存儲(chǔ)器進(jìn)行任何操作之前,你應(yīng)該始終調(diào)用getExternalStorageState() 函數(shù)來(lái)檢測(cè)媒介是否處于可用狀態(tài)。媒介可能被掛載到一臺(tái)電腦上、遺失、只讀或處于其他狀態(tài)。例如,你可以像這里這樣來(lái)檢測(cè)其是否可用:

Java代碼 

  1. boolean mExternalStorageAvailable = false;    
  2. boolean mExternalStorageWriteable = false;    
  3. String state = Environment.getExternalStorageState();    
  4. if (Environment.MEDIA_MOUNTED.equals(state)) {        
  5.     // We can read and write the media        
  6.     mExternalStorageAvailable = mExternalStorageWriteable = true;    
  7. } else     
  8. if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))     
  9. {        
  10.     // We can only read the media        
  11.     mExternalStorageAvailable = true;        
  12.     mExternalStorageWriteable = false;    
  13. } else {        
  14.     // Something else is wrong. It may be one of many other states, but all we need        
  15.     //  to know is we can neither read nor write        
  16.     mExternalStorageAvailable = mExternalStorageWriteable = false;    
  17. }    

這個(gè)例子檢測(cè)外部存儲(chǔ)器是否可用于讀和寫。你可能希望檢測(cè)getExternalStorageState() 函數(shù)返回的其他狀態(tài),例如媒介是否被共享了(連接到了電腦)、是否完全遺失了、被意外移除了等等。當(dāng)你的應(yīng)用需要訪問(wèn)媒介的時(shí)候,你可以使用這些(攜帶更多的信息)來(lái)提示用戶。

訪問(wèn)外部存儲(chǔ)器上的文件 (Accessing files on external storage)

如果你使用的是API Level 8或更高版本,使用getExternalFilesDir() 函數(shù)來(lái)打開一個(gè)代表外部存儲(chǔ)器目錄(你最終儲(chǔ)存文件的地方)的File 對(duì)象。該函數(shù)使用一個(gè)type 參數(shù)來(lái)指定你希望的子目錄的類型,例如  DIRECTORY_MUSIC 和 DIRECTORY_RINGTONES (傳null 值,會(huì)返回你應(yīng)用文件目錄的根目錄)。該函數(shù)會(huì)在需要時(shí)創(chuàng)建合適的目錄。

如果你使用的是API Level 7或更低的版本,使用getExternalStorageDirectory() 函數(shù)來(lái)打開一個(gè)代表外部存儲(chǔ)器根目錄的File 對(duì)象。然后,你應(yīng)該將你的數(shù)據(jù)寫入到以下的目錄:

/Android/data/<package_name> /files/<package_name> 是你的Java風(fēng)格的包名,比如"com.example.android.app "。如果用戶的設(shè)備正在運(yùn)行的是API Level 8或更高的版本,那么在你的應(yīng)用被卸載后,該目錄及其中的所有內(nèi)容都將被刪除掉。

 從Media Scanner中隱藏你的文件

包含一個(gè)命名為 .nomedia 的空文件到你的外部文件目錄(注意文件名中的點(diǎn)前綴)。這樣會(huì)防止Android的media scanner通過(guò)讀取你的媒介文件并包含他們到應(yīng)用中,想畫廊或音樂(lè)。

保存可被共享的文件 (Saving files that should be shared)

如果你希望保存的文件并不特定于你的應(yīng)用并且不會(huì)在應(yīng)用卸載時(shí)被刪除,請(qǐng)將他們保存到外部存儲(chǔ)器上的一個(gè)公有目錄。這些目錄放置在外部存儲(chǔ)器的根目錄下,比如  Music/ ,  Pictures/ ,  Ringtones/   及其他。

在API Level 8或更高版本中,使用  getExternalStoragePublicDirectory() 函數(shù),傳給它一個(gè)你希望的公有目錄類型,比如  DIRECTORY_MUSIC ,  DIRECTORY_PICTURES,  DIRECTORY_RINGTONES或其他。該函數(shù)將在必要的時(shí)候創(chuàng)建合適的目錄。
 
如果你使用的是API Level 7或更低的版本,使用getExternalStorageDirectory() 函數(shù)來(lái)打開一個(gè)代表外部存儲(chǔ)器根目錄的File 對(duì)象。然后,儲(chǔ)存你的共享文件到以下目錄中的一個(gè)里面:

  1. Music/   - Media scanner classifies all media found here as user music.  
  2. Podcasts/   - Media scanner classifies all media found here as a podcast.  
  3. Ringtones/   - Media scanner classifies all media found here as a ringtone.  
  4. Alarms/   - Media scanner classifies all media found here as an alarm sound.  
  5. Notifications/   - Media scanner classifies all media found here as a notification sound.  
  6. Pictures/   - All photos (excluding those taken with the camera).  
  7. Movies/   - All movies (excluding those taken with the camcorder).  
  8. Download/   - Miscellaneous downloads. 

保存緩存文件 (Saving cache files)

如果你使用的是API Level 8或更高的版本,使用getExternalCacheDir() 函數(shù)來(lái)打開一個(gè)代表外部存儲(chǔ)器中你將儲(chǔ)存緩存文件的目錄的File 對(duì)象。如果用戶卸載你的應(yīng)用,這些文件將會(huì)被自動(dòng)刪除。無(wú)論如何,在你應(yīng)用的生命中,你應(yīng)該管理這些緩存文件并在不再需要的時(shí)候移除它們以便保存文件空間。
 
如果你使用的是API Level 7或更低的版本,使用getExternalStorageDirectory() 函數(shù)來(lái)打開一個(gè)代表外部存儲(chǔ)器根目錄的File 對(duì)象,然后將你的緩存數(shù)據(jù)寫入到下面的目錄:/Android/data/<package_name> /cache/<package_name> 是你的Java風(fēng)格的包名,比如"com.example.android.app "。

使用數(shù)據(jù)庫(kù) (Using Databases)

Android提供了對(duì)SQLite 數(shù)據(jù)庫(kù)的完整支持。任何你所創(chuàng)建的數(shù)據(jù)庫(kù)在應(yīng)用中的任何一個(gè)類中都可以通過(guò)其文件名來(lái)訪問(wèn)到,但無(wú)法在應(yīng)用外部訪問(wèn)。

創(chuàng)建一個(gè)新的SQLite數(shù)據(jù)庫(kù),推薦的方式是創(chuàng)建一個(gè)SQLiteOpenHelper 的子類并重寫其onCreate() 函數(shù),在該函數(shù)中執(zhí)行SQLite命令來(lái)在數(shù)據(jù)庫(kù)中創(chuàng)建表。例如:

Java代碼 

  1. public class DictionaryOpenHelper extends SQLiteOpenHelper {        
  2.     private static final int DATABASE_VERSION = 2;        
  3.     private static final String DICTIONARY_TABLE_NAME = "dictionary";        
  4.     private static final String DICTIONARY_TABLE_CREATE =                    
  5.         "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +                    
  6.         KEY_WORD + " TEXT, " +                    
  7.         KEY_DEFINITION + " TEXT);";        
  8.     DictionaryOpenHelper(Context context) {            
  9.         super(context, DATABASE_NAME, null, DATABASE_VERSION);        
  10.     }        
  11.     @Override        
  12.     public void onCreate(SQLiteDatabase db) {            
  13.         db.execSQL(DICTIONARY_TABLE_CREATE);        
  14.     }    
  15. }    

然后你可以使用你已定義的構(gòu)造函數(shù)來(lái)獲得一個(gè)你實(shí)現(xiàn)的SQLiteOpenHelper 實(shí)例。調(diào)用  getWritableDatabase() 函數(shù)和getReadableDatabase() 函數(shù)分別來(lái)寫進(jìn)或讀出數(shù)據(jù),兩個(gè)函數(shù)都會(huì)返回一個(gè)表示數(shù)據(jù)庫(kù)的SQLiteDatabase 對(duì)象,并為SQLite的操作提供了函數(shù)。

 Android沒有在標(biāo)準(zhǔn)的SQLite概念上添加任何限制。我們推薦包含一個(gè)自動(dòng)增量數(shù)值鍵字段來(lái)被用于作為一個(gè)***的ID,以便快速找到一個(gè)記錄。這不需要是一個(gè)私有數(shù)據(jù),但如果你實(shí)現(xiàn)了一個(gè) content provider ,你就必須使用BaseColumns._ID 常量來(lái)包含一個(gè)***的ID。

你可以使用SQLiteDatabase 的query() 函數(shù)來(lái)執(zhí)行SQLite的查詢,query() 函數(shù)支持各種查詢參數(shù),例如查詢表時(shí)就有projection, selection, columns, grouping等參數(shù)可配置。對(duì)于復(fù)雜的查詢,例如那些需要列別名的,你應(yīng)該使用SQLiteQueryBuilder ,它提供了多個(gè)便捷的函數(shù)可用于構(gòu)建查詢。

每個(gè)SQLite查詢都會(huì)返回一個(gè)Cursor 對(duì)象,它指向查詢所找到的所有的行。Cursor 永遠(yuǎn)是你操縱數(shù)據(jù)庫(kù)查詢結(jié)果及讀取行和列的途徑。

作為Android中展示了如何使用SQLite數(shù)據(jù)庫(kù)的例子,請(qǐng)查看Note Pad 和Searchable Dictionary 應(yīng)用。

數(shù)據(jù)庫(kù)調(diào)試 (Database debugging)

Android SDK包含了一個(gè)數(shù)據(jù)庫(kù)工具來(lái)允許你瀏覽表格的內(nèi)容,在SQLite數(shù)據(jù)庫(kù)上運(yùn)行SQL命令,并執(zhí)行其他有用的方法。查閱Examining sqlite3 databases from a remote shell 學(xué)習(xí)如何運(yùn)行該工具。

使用網(wǎng)絡(luò)連接 (Using a Network Connection)

你可以在你自己的基于網(wǎng)絡(luò)的服務(wù)器上使用網(wǎng)絡(luò)(當(dāng)它可用的時(shí)候)來(lái)儲(chǔ)存和接收數(shù)據(jù)。要執(zhí)行網(wǎng)絡(luò)操作,使用下面的包中的類:java.net.* android.net.*

 

原文請(qǐng)查閱:http://developer.android.com.nyud.net/guide/topics/data/data-storage.html

 

【編輯推薦】

  1. Android可選API適用范圍
  2. 51CTO獨(dú)家專訪:Android開發(fā)入門問(wèn)與答
  3. Android贏家密碼(一):什么是贏家密碼

 

責(zé)任編輯:佚名 來(lái)源: javaeye
相關(guān)推薦

2017-05-25 12:30:44

AndroidApp開發(fā)架構(gòu)

2011-04-20 14:59:39

bada APIbada

2019-10-11 09:38:56

谷歌Android開發(fā)者

2017-07-18 16:40:31

AndroidLiveData

2011-02-17 13:35:12

ADT 9.0.0ADT下載ADT安裝

2014-12-08 12:50:24

Android AutGoogle

2012-04-25 22:58:36

2011-09-05 14:02:53

Android視頻教程

2011-09-14 13:35:55

Android API

2011-09-14 11:31:26

Android API

2011-09-14 13:18:59

Android API

2011-09-14 13:56:28

Android API

2011-09-14 13:09:06

Android API

2011-09-14 14:08:23

Android API

2015-04-22 10:57:22

androidSwipeRefres

2011-09-14 13:24:48

Android API

2012-11-14 09:29:16

MySQLGoogle數(shù)據(jù)庫(kù)

2010-04-21 14:25:22

bada三星

2014-05-05 11:41:09

云儲(chǔ)存谷歌

2011-02-18 14:02:36

Android R5 Android NDKAndroid NDK
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)