Одна ушла, вторая нет.
410013796724260
• Webmoney
R335386147728
Z369087728698
Хранение данных, файлов в AndroidРазработчики Android имеют различные возможности хранения данных приложения локально. Сюда следует отнести, прежде всего, настройки приложения. Кроме этого, можно использовать внутренние и внешние хранилища (файлы). Также данные можно хранить в БД (базе данных) типа SQLite, либо в сторонних базах данных, которые предлагают поддержку NoSQL. Настройки приложенияК настройкам приложения в первую очередь следует отнести простые данные в формате ключ-значение. Объем таких данных незначителен и включает обозримое количество строк. Для доступа к этим данным можно использовать меню настроек приложения. Это достаточно хорошая идея хранить «под рукой» логические флаги, короткие строки, целые и вещественные числа для настройки интерфейса и бизнес-логики приложения. Для программного доступа к настройкам используются методы :
Все эти методы возвращают объект типа 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 :
Ниже представлено описание данных классов, возвращающих объекты 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. |