В статье хотелось охватить наиболее часто применяемые способы хранения данных в операционной системе Android
- SharedPreferences — Хранение парой ключ-значение
- File system file
- CacheDir — Хранение в cache directory на файловой системе
- ExternalStorage — Хранение файлов на внешнем хранилище
- SQLiteDatabase — База данных
Shared Preference
Хранение в виде ключ-значение. Подходит для хранения глобальных данных. Также можно хранить небольшие структуры, предварительно конвертированные в JSON и преобразованные в String. Для более сложных и больших по объему данных предпочтительней использовать SQLiteDatabase
public class AppStore {
public static final String WEATHER_FORECAST_PREF_NAME = "app_store_my_app";
public static final String FIRST_RUN_APP = "first_run_app";
public static final String FONT_SIZE = "font_size";
public static int getFontSize(Context context) {
SharedPreferences pref = context.getSharedPreferences(WEATHER_FORECAST_PREF_NAME, 0);
return pref.getInt(FONT_SIZE, 18);
}
...
Можно использовать как флаг для проверки первого запуска приложения
public static boolean isFirstRun(Context context){
SharedPreferences pref = context.getSharedPreferences(WEATHER_FORECAST_PREF_NAME, boolean flg = pref.getBoolean(FIRST_RUN_APP, true);
if(flg){
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean(FIRST_RUN_APP, false);
editor.commit();
}
return flg;
}
File system
Файловая система. Можно использовать для кэширования данных из сети. URL преобразуется в имя файла
String filename = URLEncoder.encode(url, «UTF-8»);
Проверка доступа к внешнему или внутреннему хранилищу данных и создание папки:
public FileCache(Context context){
if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED))
cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),"weatherforecast");
else
cacheDir=context.getCacheDir();
if(!cacheDir.exists())
cacheDir.mkdirs();
}
Сохранение данных на диске по имени файла:
public void putFileData(String filename, String data){
try{
// Create file
File f = new File(cacheDir, filename);
FileWriter fstream = new FileWriter(f);
BufferedWriter out = new BufferedWriter(fstream);
out.write(data);
//Close the output stream
out.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
Чтение данных с диска по имени файла. Обратите внимание что для «склеивания» строк используется StringBuilder:
public String getFileData(String filename){
String line = new String();
StringBuilder text = new StringBuilder();
try{
// Create file
File f = new File(cacheDir, filename);
FileReader fstream = new FileReader(f);
BufferedReader in = new BufferedReader(fstream);
while ((line = in.readLine()) != null) {
text.append(line);
text.append('n');
}
in.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
return text.toString();
}
SQLiteDatabase База Данных
Для упорядоченного хранения больших списков данных можно использовать SQLiteDatabase. Для этих целей в системе есть SQLiteOpenHelper. С его помощью можно создать или проверить версию своей базы для возможности Upgrade с выходом новой версии программы. Если например новая версия программы содержит базу с новыми полями. Не вдаваясь в подробности приведу пару полезных на мой взгляд вещей
- Начальная инициализация. Полезна когда надо заполнить начальными данными Базу Данных после создания при первом запуске программы или после Upgrade
public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE); String sql = "INSERT INTO " + TABLE_CITIES + "(" + COLUMN_CITY + ") VALUES('London')" ; database.execSQL(sql); ...
- Исключение дубликатов в полях Базы Данных то есть поддержка уникальных полей. Например можно сделать чтобы Города в списке не повторялись, а если будет попытка добавления города с таким же именем, то поле перезапишется. В данном примере COLUMN_CITY уникальное поле
private static final String DATABASE_CREATE = "create table " + TABLE_CITIES + "(" + COLUMN_ID + " integer primary key autoincrement, " + COLUMN_CITY + " text not null, UNIQUE(" + COLUMN_CITY + ") ON CONFLICT REPLACE);";
В статье рассмотрены простые примеры хранения данных в операционной системе Android. В следующей статье я расскажу о способах взаимодействия компонентов Android, таких как AppWidgetProvider, Service, ContentObserver, ContentProvider
Все вышеперечисленное вы можете посмотреть уже сейчас в демо-проекте на github.
Автор: app-z