Постоянное хранение данных обеспечивает сохранность пользовательской информации между сессиями работы мобильного приложения. Без этой технологии каждый запуск программы начинался бы с чистого листа — настройки, история и загруженные файлы терялись бы при закрытии. По данным Google Developers, 2024, более 90% мобильных приложений используют хотя бы один механизм постоянного хранения для сохранения пользовательских данных и состояния интерфейса.
Главное
Data Persistence — это способность приложения сохранять данные в энергонезависимой памяти устройства. В мобильной разработке постоянное хранение охватывает базы данных, файловую систему, настройки и кэш. Каждый механизм имеет свои особенности производительности, безопасности и объёма хранимой информации.
Временные данные существуют только в оперативной памяти и теряются при завершении процесса. К ним относятся состояние экрана, временные вычисления и кэш изображений. Постоянные данные записываются в файловую систему или базу данных и остаются доступными после перезапуска приложения. К ним относятся настройки пользователя, токены авторизации, история операций и загруженный контент.
При выборе способа сохранения разработчик оценивает несколько факторов. Тип данных определяет структуру хранения: простые настройки — SharedPreferences или DataStore, структурированные записи — SQLite или Room, файлы — File Storage. Объём данных влияет на производительность: базы данных оптимизированы для тысяч записей, а файлы — для больших бинарных объектов. Безопасность требует шифрования чувствительной информации через EncryptedSharedPreferences или SQLCipher.
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences — классический способ хранения пар ключ-значение на Android. Этот API существует с первых версий платформы и поддерживает примитивные типы: строки, числа, булевы значения. Данные хранятся в XML-файле в приватной директории приложения и доступны только его процессу.
Jetpack DataStore — современная замена SharedPreferences, построенная на Kotlin Coroutines и Flow. DataStore предлагает два варианта: Preferences DataStore для простых значений и Proto DataStore для типизированных объектов. В отличие от SharedPreferences, DataStore гарантирует согласованность данных при конкурентном доступе и поддерживает асинхронные операции без блокировки основного потока.
// SharedPreferences — традиционный способ
val prefs = context
.getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
putString("username", "john_doe")
putInt("score", 1500)
apply()
}
// DataStore — асинхронный подход
val settingsDataStore = context
.createDataStore("settings.pb")
val usernameFlow: Flow<String> = settingsDataStore
.data
.map { it[USERNAME_KEY] ?: "" }
На iOS эквивалентом SharedPreferences служит UserDefaults — система хранения простых значений в Property List формате. UserDefaults использует синхронный доступ и подходит для небольших объёмов конфигурационных данных, но не рекомендуется для хранения чувствительной информации.
SQLite — встраиваемая реляционная база данных, которая работает внутри процесса приложения без отдельного сервера. Это самая распространённая СУБД в мобильной разработке: она используется по умолчанию на обеих платформах. Android включает SQLite в SDK, а iOS — в библиотеку libsqlite3. SQLite поддерживает стандартный SQL, транзакции, индексы и триггеры.
Работа с SQLite начинается с создания схемы базы данных. Разработчик определяет таблицы, их поля и типы, после чего выполняет операции вставки, чтения, обновления и удаления. SQLiteOpenHelper на Android управляет созданием и миграциями базы, а на iOS используется C-интерфейс или обёртка FMDB.
// SQLiteOpenHelper на Android
class DBHelper(context: Context) :
SQLiteOpenHelper(context, "app.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
}
fun insertUser(name: String, email: String) {
val db = writableDatabase
val values = ContentValues().apply {
put("name", name)
put("email", email)
}
db.insert("users", null, values)
}
}
| Тип данных | SharedPreferences | SQLite | Файловая система |
|---|---|---|---|
| Тип | ключ-значение | реляционная БД | бинарные файлы |
| Объём | сотни записей | тысячи записей | доступное место |
| Производительность | высокая | средняя | зависит от размера |
| Типичное применение | настройки | структурированные данные | изображения, видео |
Room — библиотека из состава Jetpack, предоставляющая ORM-слой поверх SQLite. Room устраняет рутинную работу по написанию SQL-запросов и ContentValues, заменяя их аннотациями и Kotlin-функциями. Компилятор Room генерирует реализацию DAO (Data Access Object) на этапе сборки, что исключает ошибки в SQL-синтаксисе.
Для подключения Room необходимо добавить зависимость kapt и аннотировать класс сущности, DAO-интерфейс и класс базы данных. RoomDatabase служит точкой входа: через него получают DAO и выполняют операции с базой. Room поддерживает Flow для реактивных запросов, миграции схемы и проверку запросов на этапе компиляции.
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "full_name") val name: String,
@ColumnInfo val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): Flow<List<User>>
@Insert
suspend fun insert(user: User)
@Delete
suspend fun delete(user: User)
}
@Database(
entities = [User::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Core Data — фреймворк Apple для управления графом объектов и их сохранением на диск. В отличие от Room, Core Data работает не с таблицами, а с управляемыми объектами (NSManagedObject), которые образуют иерархию связей. Core Data поддерживает ленивую загрузку, отмену изменений и сложные запросы через NSFetchRequest.
Основу Core Data составляет стек из трёх компонентов: управляемый контекст (NSManagedObjectContext), постоянное хранилище (NSPersistentStoreCoordinator) и модель данных (NSManagedObjectModel). NSPersistentContainer объединяет все компоненты в единую точку входа, упрощая настройку для современных приложений на Swift.
import CoreData
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "AppModel")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed: \(error)")
}
}
}
func saveUser(name: String, email: String) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.email = email
do {
try context.save()
} catch let error {
print("Save error: \(error)")
}
}
}
Файловое хранение (File Storage) используется для сохранения изображений, видео и документов. Android предоставляет внутреннее хранилище (context.filesDir) — приватное для приложения, и внешнее (Environment.getExternalStorageDirectory) — доступное другим приложениям. На iOS файлы сохраняются в директориях Documents и Library, причём Library/Caches предназначена для кэша, не подлежащего бэкапу в iCloud. Для работы с файлами обе платформы предоставляют File API и потоковые операции чтения и записи. Современные библиотеки вроде Coil и SDWebImage добавляют слой кэширования, комбинируя файловое хранение с оперативной памятью для оптимальной производительности.
На Android альтернативой Core Data по сложности и функциональности выступает Realm — объектная база данных, работающая напрямую с моделями без SQL-прослойки. Realm быстрее SQLite в операциях чтения и поддерживает live-объекты, которые автоматически обновляют UI при изменении данных.
Часто задаваемые вопросы
Data Persistence — это механизмы сохранения данных в энергонезависимой памяти устройства, обеспечивающие их доступность после перезапуска приложения. К ним относятся базы данных, файловое хранение и системы настроек.
Room — это ORM-обёртка над SQLite, которая устраняет ручное написание SQL-запросов и ContentValues. Room проверяет SQL-запросы на этапе компиляции, поддерживает Kotlin Coroutines и Flow, а также автоматически генерирует код доступа к данным.
SharedPreferences подходит для хранения небольшого объёма простых данных: настроек приложения, флагов, идентификаторов и пользовательских предпочтений. Для сложных или структурированных данных лучше использовать Room или DataStore.
Core Data — фреймворк Apple для управления графом объектов. Он предоставляет работу с управляемыми объектами, отслеживание изменений, ленивую загрузку и автоматическое сохранение в постоянное хранилище (SQLite, XML или бинарный формат).
Выбор зависит от сложности данных: для настроек — DataStore или UserDefaults, для структурированных записей — Room (Android) или Core Data (iOS), для файлов — File Storage. Критерии включают объём данных, требования к производительности и необходимость шифрования. Комбинирование нескольких механизмов в одном приложении — стандартная практика, позволяющая оптимально использовать сильные стороны каждого подхода.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также