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. |
