Способы хранения данных в Android

в 15:30, , рубрики: android, api, Программирование, хранение данных

В статье хотелось охватить наиболее часто применяемые способы хранения данных в операционной системе Android

  1. SharedPreferences — Хранение парой ключ-значение
  2. File system file
    • CacheDir — Хранение в cache directory на файловой системе
    • ExternalStorage — Хранение файлов на внешнем хранилище
  3. 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 с выходом новой версии программы. Если например новая версия программы содержит базу с новыми полями. Не вдаваясь в подробности приведу пару полезных на мой взгляд вещей

  1. Начальная инициализация. Полезна когда надо заполнить начальными данными Базу Данных после создания при первом запуске программы или после Upgrade
    public void onCreate(SQLiteDatabase database) {
    	database.execSQL(DATABASE_CREATE);
    	String sql = "INSERT INTO "
    		+ TABLE_CITIES
    		+ "(" + COLUMN_CITY + ") VALUES('London')" ;
    	database.execSQL(sql);
    	...
    

  2. Исключение дубликатов в полях Базы Данных то есть поддержка уникальных полей. Например можно сделать чтобы Города в списке не повторялись, а если будет попытка добавления города с таким же именем, то поле перезапишется. В данном примере 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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js