В Android существует несколько основных способов хранения данных, каждый из которых подходит для разных сценариев использования.
1. SharedPreferences
SharedPreferences prefs = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("key", "value");
editor.apply();
Характеристики:
- Хранение: Ключ-значение (примитивные типы)
- Объем: Небольшие данные (обычно <1MB)
- Использование: Настройки приложения, флаги, простые состояния
- Доступ: Только в рамках приложения
- Особенности: Асинхронное сохранение (apply()) или синхронное (commit())
2. Внутреннее хранилище
// Запись
FileOutputStream fos = openFileOutput("filename", MODE_PRIVATE);
fos.write(data.getBytes());
fos.close();
// Чтение
FileInputStream fis = openFileInput("filename");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
Характеристики:
- Хранение: Файлы в приватной директории приложения
- Объем: Средние/большие данные
- Использование: Структурированные данные, кэш
- Доступ: Только для вашего приложения
- Особенности: Удаляется с приложением, можно использовать поддиректории
3. Внешнее хранилище
File file = new File(Environment.getExternalStorageDirectory(), "filename");
Характеристики:
- Хранение: Файлы в общем хранилище
- Объем: Большие данные (фото, видео и т.д.)
- Использование: Общие файлы, доступные другим приложениям
- Доступ: Требует разрешений (начиная с Android 10 - Scoped Storage)
- Особенности: Может быть недоступно (SD-карта извлечена)
4. Базы данных
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
val db = Room.databaseBuilder(
context,
AppDatabase::class.java, "database-name"
).build()
Характеристики:
- Хранение: Реляционная БД (таблицы, связи)
- Объем: Средние/большие структурированные данные
- Использование: Сложные структуры данных, частые запросы
- Доступ: Только для вашего приложения
- Особенности: Room - рекомендованная абстракция над SQLite
5. DataStore
val dataStore: DataStore<Preferences> = context.createDataStore(name = "settings")
suspend fun savePrefs(key: String, value: Int) {
dataStore.edit { prefs ->
prefs[intPreferencesKey(key)] = value
}
}
Характеристики:
- Хранение: Ключ-значение или прото-буферы
- Объем: Небольшие/средние данные
- Использование: Замена SharedPreferences с Kotlin coroutines/Flow
- Особенности: Асинхронный API, типобезопасность
6. Сетевое хранилище
interface ApiService {
@GET("data")
suspend fun getData(): Response<DataModel>
}
Характеристики:
- Хранение: Удаленные серверы (REST, GraphQL, gRPC)
- Объем: Любой
- Использование: Данные, требующие синхронизации между устройствами
- Особенности: Требует интернет-соединения, кэширование желательно
7. Content Providers
val cursor = contentResolver.query(
Uri.parse("content://com.example.provider/data"),
null, null, null, null
)
Характеристики:
- Хранение: Общий доступ к данным между приложениями
- Использование: Обмен данными между приложениями
- Особенности: Требует настройки манифеста и реализации провайдера
8. Firebase/другие облачные хранилища
val database = Firebase.database
val ref = database.getReference("path")
ref.setValue(data)
Характеристики:
- Хранение: Облачное решение с синхронизацией
- Использование: Мультиплатформенные данные, real-time обновления
- Особенности: Требует интернет, может быть платным при больших объемах
Критерии выбора способа хранения
-
Объем данных:
- Малый → SharedPreferences/DataStore
- Большой → База данных/Файлы
-
Структура данных:
- Простая → SharedPreferences
- Сложная → Room/SQLite
-
Доступность:
- Только приложению → Internal Storage
- Другим приложениям → Content Providers/External Storage
-
Синхронизация:
- Нужна → Сетевое хранилище/Firebase
- Не нужна → Локальные способы
Резюмируем:
Android предлагает множество вариантов хранения данных - от простых SharedPreferences до сложных SQLite баз и облачных решений. Выбор зависит от объема, структуры данных, требований к безопасности и необходимости синхронизации. Для новых проектов рекомендуется использовать современные решения типа Room и DataStore вместо устаревающих SQLiteOpenHelper и SharedPreferences.