Как хранить данные в Android?

В Android есть несколько способов хранения данных, каждый из которых подходит для разных задач: от временного кэширования до долговременного хранения пользовательских настроек, медиа и структурированных данных. Выбор зависит от:

  • объёма и структуры данных,

  • уровня безопасности,

  • доступности между компонентами/приложениями,

  • необходимости синхронизации с сервером.

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

1. SharedPreferences — для простых ключ-значение настроек

  • Подходит для хранения: логина, флагов (isFirstLaunch, darkTheme), токенов.

  • Формат: ключ — значение (String, Boolean, Int и т.д.).

  • Хранится в виде XML в data/data/<package>/shared_prefs.

val prefs = getSharedPreferences("app_settings", Context.MODE_PRIVATE)
prefs.edit().putBoolean("dark_mode", true).apply()
  • Не подходит для сложных или больших данных.

  • В Kotlin можно использовать DataStore как современную альтернативу.

2. Room (SQLite) — для структурированных таблиц и связей

  • Подходит для сложных, связанных данных (например, списки задач, истории, кэш).

  • Основан на SQLite, но с уровнем абстракции и проверкой запросов на этапе компиляции.

  • Используется с DAO, Entity и корутинами.

@Entity
data class User(@PrimaryKey val id: Int, val name: String)
@Dao
interface UserDao {
@Query("SELECT \* FROM user") suspend fun getAll(): List&lt;User&gt;
}
  • Безопасно, быстро, интегрируется с LiveData, Flow.

3. DataStore — альтернатива SharedPreferences

  • Современный способ хранения предпочтений и небольших данных.

  • Основан на Kotlin Flow и асинхронной архитектуре.

  • Два варианта: Preferences DataStore и Proto DataStore.

val darkMode = booleanPreferencesKey("dark_mode")
dataStore.edit { it\[darkMode\] = true }
  • Безопаснее, чем SharedPreferences, и не блокирует поток.

4. Internal Storage — приватные файлы внутри приложения

  • Хранение файлов (.txt, .json, .jpg, и т.д.) в папке /data/data/<package>/files.

  • Доступны только текущему приложению.

openFileOutput("data.json", Context.MODE_PRIVATE).use {
it.write(jsonString.toByteArray())
}
  • Подходит для временных или конфиденциальных файлов.

5. External Storage — файлы, доступные за пределами приложения

  • Папки вроде Downloads, Pictures, Documents.

  • Начиная с Android 10, требует работы через MediaStore и Storage Access Framework из-за Scoped Storage.

val file = File(getExternalFilesDir(null), "myfile.txt")
  • Подходит для пользовательских документов, фото, кэша, к которому нужен доступ извне.

6. Кеш (Cache)

  • Временное хранение данных: изображений, HTML, API-ответов.

  • Используется, например, в библиотеке Glide для кеша изображений.

  • getCacheDir() — внутренний кеш, очищается системой при нехватке памяти.

7. Базы данных сторонних библиотек

  • Realm: альтернатива Room, с реактивным API и встроенной синхронизацией.

  • ObjectBox: объектно-ориентированная БД с высокой производительностью.

  • Используются, если Room не подходит по производительности или удобству.

8. EncryptedSharedPreferences / EncryptedFile — для безопасного хранения

  • Шифрует данные на устройстве.

  • Подходит для хранения токенов, логинов, секретов.

val encryptedPrefs = EncryptedSharedPreferences.create(
"secret_prefs",
masterKeyAlias,
context,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

9. Cloud (Firebase, Google Drive, серверное API)

  • Синхронизация между устройствами.

  • Хранение резервных копий.

  • Firebase Realtime Database, Firestore, Google Drive API.

📌 Что выбрать

Задача Способ хранения
Настройки и флаги SharedPreferences, DataStore
--- ---
Структурированные данные Room, Realm, ObjectBox
--- ---
Временные файлы и кэш getCacheDir(), Glide, OkHttp
--- ---
Секретные данные EncryptedSharedPreferences
--- ---
Пользовательские файлы External Storage, MediaStore
--- ---
Межустройственная синхронизация Firebase, собственное API
--- ---

Итого

Android предлагает множество способов хранения данных: от простых ключ-значений до полноценных БД и облака. Для максимальной эффективности и безопасности стоит подбирать инструмент под конкретную задачу: Room для структурированных данных, DataStore для настроек, EncryptedPrefs — для конфиденциальной информации.