Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android API Guides---Data Storage

Android API Guides---Data Storage

編輯:關於Android編程

數據存儲
在數據庫,文件,或偏好,內部或可移動存儲存儲應用程序數據。您還可以添加一個數據備份服務,讓用戶存儲和恢復的應用程序和系統數據。
存儲選項
訓練
同步到雲

本課程涵蓋了雲計算功能的應用不同的策略。它涵蓋了同步數據和使用雲自己的後端的Web應用程序,並使用雲,這樣一個新的設備上安裝應用程序時,用戶可以恢復他們的數據備份數據。

存儲選項

Android提供了幾個選項,為您節省持久應用程序數據。您選擇的解決方案取決於您的特定需求,如數據是否應該是私有的應用程序或訪問其他應用程序(和用戶),並多少空間您的數據需要。


您的數據存儲選項如下:


Shared Preferences
存儲在鍵值對私人的基本數據。
Internal Storage
存儲在設備內存的私人數據。
External Storage
存儲在共享外部存儲公共數據。
SQLite Databases
在專用數據庫存儲結構化數據。
Network Connection
用自己的網絡服務器在網絡上存儲數據。
Android提供了一個方法可以讓你即使您的私人數據暴露給其他應用程序 - 與內容提供商。內容提供商是一個可選組件,公開讀給你的應用程序數據/寫訪問,受要強加任何限制。有關使用內容提供商的更多信息,請參閱內容提供商的文檔。


使用Shared Preferences


該SharedPreferences類提供了一個總體框架,使您可以保存和檢索的原始數據類型的持久鍵 - 值對。您可以使用SharedPreferences保存任何基本數據:布爾型,浮點數,整型,長整型和字符串。該數據將在用戶會話持久(即使你的應用程序被殺害)。


用戶首選項


共享偏好不嚴格用於保存“用戶首選項”,比如什麼鈴聲用戶選擇。如果您有興趣為應用程序創建用戶喜好,看PreferenceActivity,它提供了一個框架的活動,為您創建用戶喜好,這將是自動持久(使用共享喜好)。
要獲得SharedPreferences對象為你的應用程序,使用以下兩種方法之一:


getSharedPreferences() - 如果你需要通過名稱標識多個首選項文件,你的第一個參數指定使用此。
的getPreferences() - 如果你只需要一個為你的活動喜好文件中使用此。因為這將是唯一的喜好提交您的活動,你不提供一個名稱。
寫值:


調用編輯()得到一個SharedPreferences.Editor。
與方法,如putBoolean()和putString添加值()。
提交與提交新的值()
要讀取值,使用SharedPreferences等方法getBoolean()和GetString()。


這裡是保存在一個計算器按鍵靜音模式下的偏好的例子:

 

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();

   // We need an Editor object to make preference changes.
   // All objects are from android.context.Context
   SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
   SharedPreferences.Editor editor = settings.edit();
   editor.putBoolean("silentMode", mSilentMode);

   // Commit the edits!
   editor.commit();
  }
}
使用內部存儲


您可以直接在設備的內部存儲保存文件。默認情況下,保存到內部存儲文件是私有的應用程序和其他應用程序無法訪問它們(也可以在用戶)。當用戶卸載應用程序,這些文件將被刪除。


要創建並寫入一個私人文件到內部存儲:


與該文件的名稱和操作模式調用openFileOutput()。這將返回一個FileOutputStream。
寫與寫文件()。
接近關閉流()。
例如:

 

 

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
MODE_PRIVATE將創建文件(或替換同名的文件),並使其專用於您的應用程序。其他可用的模式有:MODE_APPEND,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。


讀取內部存儲的文件:


呼叫openFileInput(),並通過它來讀取文件的名稱。這將返回一個FileInputStream。
讀取從文件中讀取字節()。
然後緊密關閉流()。
提示:如果您想保存在編譯時在應用程序中的靜態文件,將文件保存在您的項目RES /生/目錄下。你可以用openRawResource()打開它,傳遞R.raw。<文件名>資源ID。此方法返回可用於讀取該文件(但不能寫入原始文件)一個InputStream。


保存緩存文件


如果您想緩存一些數據,而不是存儲它堅持,你應該使用getCacheDir()打開表示內部目錄,應用程序應該保存臨時緩存文件的文件。


當設備處於低內部存儲空間,Android版可能會刪除這些緩存文件來??恢復空間。但是,你不應該依靠制度來清理這些文件給你。你應該始終保持緩存文件自己,保持消費的空間合理的限度,如1MB以內。當用戶卸載應用程序,這些文件將被刪除。


其他有用的方法


getFilesDir()
獲取到您的內部文件都保存在文件系統目錄的絕對路徑。
GETDIR()
創建(或打開現有)的內部存儲空間中的目錄。
deleteFile()
刪除保存在內部存儲的文件。
fileList()
返回當前由應用程序保存的文件的數組。
使用外部存儲


每一個Android兼容的設備支持共享“外部存儲”,你可以用它來保存文件。這可以是一個可移動的存儲介質(如SD卡)或內部(不可移動)的存儲。保存到外部存儲器中的文件是世界可讀和可以由用戶當它們使USB大容量存儲到計算機上傳輸文件進行修改。


注意:如果用戶安裝外部存儲在計算機上或刪除媒體,而且也沒有安全性的文件時您保存到外部存儲器執行外部存儲設備變得不可用。所有的應用程序可以讀寫放置在外部存儲器中的文件,並且用戶可以將其刪除。


獲得訪問外部存儲


為了在外部存儲讀取或寫入文件,應用程序必須獲得READ_EXTERNAL_STORAG??E或WRITE_EXTERNAL_STORAG??E系統權限。例如:

 

 


  
  ...
如果您需要同時讀取和寫入文件,則需要請求只有WRITE_EXTERNAL_STORAGE權限,因為它隱含需要讀取訪問以及。


注:與Android4.4開始,如果你正在讀或寫只屬於私有您的應用程序文件,這些權限不是必需的。欲了解更多信息,請參見下面關於拯救那些應用程序專用文件的部分。


檢查媒體的可用性


在你做與外部存儲的任何工作,你應該總是調用getExternalStorageState()檢查介質是否可用。介質可能被安裝到計算機,缺失,只讀,或在一些其它狀態。例如,在這裡,你可以使用它來檢查可用性的夫婦的方法:

 

 

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state)) {
    return true;
  }
  return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
  String state = Environment.getExternalStorageState();
  if (Environment.MEDIA_MOUNTED.equals(state) ||
    Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    return true;
  }
  return false;
}
該getExternalStorageState()方法返回,你可能要檢查其他國家,如媒體是否被共享(連接到計算機),完全丟失,已刪除嚴重,等等。你可以使用這些與通知用戶當你的應用程序需要訪問媒體的更多信息。


可以與其他應用程序共享文件的保存


從媒體掃描隱藏文件


包括一個空文件在外部文件目錄下名為.nomedia(注意文件名中的點前綴)。這可以防止介質的掃描儀讀取媒體文件,並通過MediaStore內容提供商把它們提供給其他應用程序。但是,如果你的文件是真正專用於您的應用程序,你應該將它們保存在一個應用程序,私有目錄。
通常,用戶可以通過你的應用程序獲得新的文件保存到設備上的“公共”位置,其他應用程序可以訪問它們,用戶可以將它們從設備上輕松復制。這樣做時,你應該使用共享的公共目錄,如音樂/,圖片/和鈴聲/之一。


為了得到較適當的公共目錄文件,調用getExternalStoragePublicDirectory(),傳遞你想要的目錄的類型,如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES,或其他人。通過將文件保存到相應的媒體類型目錄,系統的媒體掃描儀可以適當分類系統中的文件(例如,手機鈴聲會出現在系統中設置為鈴聲,而不是音樂)。


例如,下面是創建在公開的圖片目錄中的一個新相冊目錄的方法:

 

 

public File getAlbumStorageDir(String albumName) {
  // Get the directory for the user's public pictures directory.
  File file = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), albumName);
  if (!file.mkdirs()) {
    Log.e(LOG_TAG, "Directory not created");
  }
  return file;
}
節約是應用程序專用文件。
如果您正在處理未用於其他應用程序使用的文件(如圖形紋理或僅由你的應用程序中使用聲音效果),你應該調用getExternalFilesDir使用上的外部存儲專用存儲目錄()。此方法還需要一個類型參數來指定子目錄的類型(如目錄MOVIES)。如果你並不需要一個特定的媒體目錄,傳遞null收到您的應用程序的私有目錄的根目錄。
與Android4.4開始,閱讀或在應用程序的私有目錄中寫入文件不需要READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE權限。所以,你可以聲明許可只能由添加的minSdkVersion屬性較低的Android版本的請求

 

 


  
  ...
注意:當用戶卸載應用程序,這個目錄及其所有內容將被刪除。此外,系統的介質掃描儀沒有在這些目錄讀取文件,所以它們不從MediaStore內容提供商訪問。因此,你不應該使用這些目錄的媒體,最終屬於用戶,如捕獲或與您的應用程序,或音樂的用戶與您購買的編輯照片的應用程序,這些文件應該被保存在公共目錄。


有時,已分配的內部存儲器的分區用作外部存儲裝置還可以提供一個SD卡插槽。當這樣的設備運行的是Android 4.3以下時,getExternalFilesDir()方法提供只能訪問內部的分區,你的應用程序無法讀取或寫入SD卡。與Android 4.4開始,但是,您可以通過調用getExternalFilesDirs(),它返回條目每個位置的文件數組來訪問這兩個位置。數組中的第一項被認為是主要外部存儲,除非它的全部或不可用時,你應該使用的位置。如果您想訪問這兩個可能的位置,同時還支持Android 4.3及更低,使用支持庫的靜態方法,ContextCompat.getExternalFilesDirs()。這也返回一個文件數組,但總是只包括一個在Android 4.3和更低的入門。


注意事項雖然getExternalFilesDir()和getExternalFilesDirs()提供的目錄是不是由MediaStore內容提供商訪問,其他應用程序的權限READ_EXTERNAL_STORAG??E可以訪問外部存儲,包括這些所有文件。如果您需要完全限制你的文件的訪問,您應該寫你的文件到內部存儲。


保存緩存文件


打開表示外部存儲目錄,你應該保存緩存文件文件,調用getExternalCacheDir()。如果用戶卸載應用程序,這些文件會被自動刪除。


類似ContextCompat.getExternalFilesDirs(),上面提到的,你也可以訪問緩存目錄上的輔助外部存儲(如果可用)致電ContextCompat.getExternalCacheDirs()。


提示:要保存文件空間和維護應用程序的性能,您仔細管理你的緩存文件並刪除那些沒有在您的應用程序的生命周期不再需要是很重要的。


使用數據庫


Android提供了SQLite數據庫的全面支持。您創建的任何數據庫將通過名稱來訪問應用程序中的任何類,而不是應用程序之外。


推薦的方法來創建一個新的SQLite數據庫是創建SQLiteOpenHelper的子類,並重寫onCreate()方法,您可以在其中執行SQLite的命令來創建數據庫中的表。例如

 

 

public class DictionaryOpenHelper extends SQLiteOpenHelper {

  private static final int DATABASE_VERSION = 2;
  private static final String DICTIONARY_TABLE_NAME = "dictionary";
  private static final String DICTIONARY_TABLE_CREATE =
        "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
        KEY_WORD + " TEXT, " +
        KEY_DEFINITION + " TEXT);";

  DictionaryOpenHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    db.execSQL(DICTIONARY_TABLE_CREATE);
  }
}
然後,您可以使用您所定義的構造讓您SQLiteOpenHelper實現的實例。要寫入,並從數據庫中讀取,調用getWritableDatabase()和getReadableDatabase(),分別為。這些均返回表示數據庫,並提供了SQLite的操作方法SQLiteDatabase對象。
Android不征收超標准SQLite的概念,任何限制。我們建議包括可以作為一個唯一的ID可以迅速找到記錄的自動增量值鍵字段。這不是必需的私人數據,但如果你實現一個內容提供商,必須包括使用BaseColumns._ID常數的唯一ID。
可以執行使用SQLiteDatabase查詢()方法,它接受各種查詢參數,如表查詢,凸起,選擇,列,分組和其他的SQLite查詢。對於復雜的查詢,比如那些需要列別名,你應該使用SQLiteQueryBuilder,這為建立查詢幾個方便的方法。
每個SQLite的查詢將返回一個指向查詢所找到的所有行的光標。光標總是帶著你可以從一個數據庫查詢結果浏覽和閱讀的行和列的機制。
對於演示如何在Android中使用SQLite數據庫示例應用程序,看到筆記本和檢索字典應用程序。
數據庫調試
Android SDK中包含一個sqlite3的數據庫工具,允許您浏覽表的內容,運行SQL命令,並在SQLite數據庫執行其它有用的功能。請參閱從遠程shell檢查sqlite3的數據庫,以了解如何運行此工具。
使用網絡連接
您可以使用網絡(如果有的話)來存儲和檢索數據對自己的基於web的服務。做網絡業務,在下面的包使用的類:
java.net。*
android.net *。

 

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved