Как хранить данные в 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<User>
}
- Безопасно, быстро, интегрируется с 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 — для конфиденциальной информации.