Афоризм
Что прописали? Свечи? Зажигаем.
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Хранение данных, файлов в Android

Разработчики Android имеют различные возможности хранения данных приложения локально. Сюда следует отнести, прежде всего, настройки приложения. Кроме этого, можно использовать внутренние и внешние хранилища (файлы). Также данные можно хранить в БД (базе данных) типа SQLite, либо в сторонних базах данных, которые предлагают поддержку NoSQL.

Настройки приложения

К настройкам приложения в первую очередь следует отнести простые данные в формате ключ-значение. Объем таких данных незначителен и включает обозримое количество строк. Для доступа к этим данным можно использовать меню настроек приложения. Это достаточно хорошая идея хранить «под рукой» логические флаги, короткие строки, целые и вещественные числа для настройки интерфейса и бизнес-логики приложения.

Для программного доступа к настройкам используются методы :

  • getPreferences() — метод активности для доступа к настройкам активности;
  • getSharedPreferences() — метод активности для доступа к настройкам на уровне приложения;
  • getDefaultSharedPreferences() — метод класса PreferencesManager для доступа к настройкам, предоставляемым Android.

Все эти методы возвращают объект типа SharedPreferences, который может быть использован как для чтения, так и для записи в файл настроек. Чтобы сохранить одну или несколько записей в файл настроек, необходимо получить SharedPreferences.Editor вызовом метода edit объекта SharedPreferences. Пример :


SharedPreferences        prefer;
SharedPreferences.Editor editor;

prefer = getSharedPreferences();
editor = prefer.edit();

Сохранение настроек

Объект SharedPreferences.Editor имеет несколько интуитивно-понятных методов записи, которые позволяют сохранять данные настроек приложения. Например, методом putInt(key, int) можно поместить пару ключ-значение со значением типа Integer в файл настроек. Аналогично с использованием метода putFloat(key, float) сохраняется пара ключ-значение типа float. Функцию, выполняющую методом putString(key, String), можно не комментировать. После добавления одного или нескольких значений необходимо вызвать метод commit. В следующем примере в настройках сохраняются пары ключ-значение :


editor.putString ("Background", "Yellow");
editor.putInt    ("Timeout"   , 30      );
editor.putBoolean("Photo"     , false   );
editor.putBoolean("Video"     , true    );

editor.commit();

Чтение настроек

Для чтения пары ключ-значение необходимо использовать метод getXXX(param, default) объекта SharedPreferences, где XXX определяет тип данных. В следующем коде извлекаются все значение, добавленные на предыдущем шаге :


String  background = prefer.getString ("Background", "white");
int     timeout    = prefer.getInt    ("Timeout"   , 15     );
boolean photo      = prefer.gutBoolean("Photo"     , false  );

Вторым параметром всех методов getXXX(param, default) определяется значение по-умолчанию, если ключ не найден в файле настроек.

Таким образом, в файле настроек можно сохранить примитивные данные в формате ключ-значения. Если необходимо сохранить более сложные типы данных или двоичные данные, можно выбрать другой вариант хранения, либо использовать тип String с предварительной (при сохранении) и/или последующей (при чтении) обработкой текстовой строки.

Для удаления настроек используйте метод deleteSharedPreferences.


boolean deleteSharedPreferences (String name);

Пример использования SharedPreference представлен на странице Хранение данных, файлов в Android

Внутренние и внешние хранилища файлов

Ниже представлено описание методов использования внутреннего и внешнего хранилища файлов. Пример использования хранилищ файлов в Android приложениях представлен здесь.

Внутреннее хранилище

Каждое приложение Android имеет свой собственный внутренний каталог хранения, в котором можно хранить текстовые и двоичные файлы. Файлы внутри этого каталога недоступны для пользователя или других приложений, установленных на устройстве. При удалении приложения связанные с ним файлы также автоматически удаляются.

При работе с внутренним хранилищем для доступа к файлам можно использовать методы оболочки от Activity :

  • openFileInput — открыть файл на чтение;
  • openFileOutput — открыть файл на запись.

Ниже представлено описание данных классов, возвращающих объекты FileInputStream, FileOutputStream соответственно.

public FileInputStream  openFileInput  (String name);
public FileOutputStream openFileOutput (String name, int mode);

Первым параметром данных методов определяется только наименование файла (не путь к файлу). Вторым параметром (mode) метода FileOutputStream может быть значение 0 или комбинация из MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE и MODE_APPEND.

Ниже в свернутом виде представлен пример использования данных методов.

Пример записи/чтения файлов во внутреннее хранилище

void writeFile(final String fileName, final String text)
{
    try {
        FileOutputStream   fos;
        OutputStreamWriter osw;
        BufferedWriter     bw ;

        fos = openFileOutput(fileName, MODE_PRIVATE);
        osw = new OutputStreamWriter(fos);

        bw = new BufferedWriter(osw);
        bw.write(text);
        bw.close();
        Log.d(LOG_TAG, "Файл записан");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

void readFile(final String fileName)
{
    try {
        FileInputStream   fis;
        InputStreamReader isr;
        BufferedReader    br ;

        fis = openFileInput(fileName);
        isr = new InputStreamReader(fis);

        br  = new BufferedReader(isr);
        String str = "";
        while ((str = br.readLine()) != null) {
            Log.d(LOG_TAG, str);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

При работе с внутренним хранилищем имеются еще два метода, связанные с активностью (Activity) приложения : метод удаления файла deleteFile и метод чтения списка файлов fileList.

public boolean  deleteFile (String name);
public String[] fileList ();

Внешнее хранилище файлов

Внешнее хранилище относится не только к хранилищу SD-card, но и для телефонов более высокого класса это может быть внутреннее монтируемое хранилище (например, в Galaxy Nexus). Во внешнее хранилище записывают большие видеофайлы, изображения с высоким разрешением и т.д., которые совместно используются как разными приложениями, так и на разных устройствах, если Вы меняете SD-карты. Доступ к данным можно получить через путь к файлу.

Прежде чем приступить к использованию внешнего хранилища необходимо проверить его состояние с использованием метода getExternalStorageState, который возвращает текстовое значение. Ниже (в свернутом виде) представлено описание getExternalStorageState и возможные ответы (MEDIA_MOUNTED, MEDIA_UNMOUNTED ...).

Описание getExternalStorageState

/*
 * Returns the current state of the primary shared/external
 * storage media
 */
public static String getExternalStorageState ();

/*
 * Returns the current state of the shared/external storage 
 * media at the given path.
 */
public static String getExternalStorageState (File path);

/* 
 * Возможные возвращаемые значения :
 * MEDIA_UNKNOWN, 
 * MEDIA_REMOVED, 
 * MEDIA_UNMOUNTED, 
 * MEDIA_CHECKING,
 * MEDIA_NOFS,
 * MEDIA_MOUNTED,
 * MEDIA_SHARED,
 * MEDIA_MOUNTED_READ_ONLY,
 * MEDIA_BAD_REMOVAL,
 * MEDIA_UNMOUNTABLE.
 */

Проверка методом getExternalStorageState доступного хранилища должна вернуть значение типа MEDIA_MOUNTED. Вызов данной функции в примере Android Studio вернул значение «mounted».

Ниже представлены методы получения доступа к директориям хранилища Android. К каждому методу приводится краткое описание из документации на англ. языке. В нижней части описания типы хранилищ, которые можно использовать, если методу необходимо передать какое-либо значение.

Подробное описание методов обращения к хранилищам Android представлено здесь.

Методы получения доступа к хранилищу

/*
 * Return root of the "system" partition holding the core 
 * Android OS. Always present and mounted read-only.
 */
public static File getRootDirectory();
//-----------------------------------------------------------
/*
 * Return the user data directory.
 */ 
public static File getDataDirectory();
//-----------------------------------------------------------
/*
 * Return the download/cache content directory.
 */ 
public static File getDownloadCacheDirectory();
//-----------------------------------------------------------
/*
 * Return the primary shared/external storage directory. 
 * This directory may not currently be accessible if it has 
 * been mounted by the user on their computer, has been 
 * removed from the device, or some other problem has 
 * happened. You can determine its current state with 
 * getExternalStorageState().
 */
public static File getExternalStorageDirectory();
//-----------------------------------------------------------
/*
 * Get a top-level shared/external storage directory for 
 * placing files of a particular type. This is where the 
 * user will typically place and manage their own files, so
 * you should be careful about what you put here to ensure
 * you don't erase their files or get in the way of their 
 * own organization.
 */
public File   getExternalStoragePublicDirectory(String type);
//-----------------------------------------------------------
/*
 * Returns absolute paths to application-specific directories
 * on all shared/external storage devices where the 
 * application can place persistent files it owns. These 
 * files are internal to the application, and not typically
 * visible to the user as media.
 */
public File[] getExternalFilesDirs (String type);

/*
 * type :
 * Environment.DIRECTORY_MUSIC, 
 * Environment.DIRECTORY_PODCASTS,
 * Environment.DIRECTORY_RINGTONES, 
 * Environment.DIRECTORY_ALARMS, 
 * Environment.DIRECTORY_NOTIFICATIONS,
 * Environment.DIRECTORY_PICTURES, 
 * Environment.DIRECTORY_MOVIES
 */

Примеры записи и чтения; внешнее хранилище


final String MY_DIR   = "myDir" ;
final String FILENAME = "myFile";

void writeExternalFile()
{
    if (!Environment.getExternalStorageState().equals(
                         Environment.MEDIA_MOUNTED)) {
      Log.d(LOG_TAG, 
           "Доступ к внешнему хранилищу закрыт : " + 
               Environment.getExternalStorageState());
      return;
    }
    File path = Environment.getExternalStorageDirectory();
    path = new File(path.getAbsolutePath() +"/"+ MY_DIR);
    // Создаем каталог
    path.mkdirs();
    // Создаем File
    File file = new File(path, FILENAME);
    try {
      // открываем поток для записи
      BufferedWriter bw;
      bw = new BufferedWriter(new FileWriter(file));
      // пишем данные
      bw.write("Содержимое файла во внешнем хранилище");
      // закрываем поток
      bw.close();
      Log.d(LOG_TAG, "Файл записан : " + 
                      file.getAbsolutePath());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
  void readExternalFile() {
    if (!Environment.getExternalStorageState().equals(
                         Environment.MEDIA_MOUNTED)) {
      Log.d(LOG_TAG, 
           "Доступ к внешнему хранилищу закрыт : " + 
               Environment.getExternalStorageState());
      return;
    }
    File path = Environment.getExternalStorageDirectory();
    path = new File(path.getAbsolutePath() +"/"+ MY_DIR);
    File file = new File(path, FILENAME);
    try {
      // открываем поток для чтения
      BufferedReader br;
      br = new BufferedReader(new FileReader(file));
      String str = "";
      // читаем содержимое
      while ((str = br.readLine()) != null) {
        Log.d(LOG_TAG, str);
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

База данных SQLite

Описание методов взаимодействия с SQLite в виду значительного объема вынесено на отдельную страницу БД SQLite в Android. Кроме этого, Вы можете также перейти на страницу с Примером SQLite в Android.

  Рейтинг@Mail.ru