Постійне зберігання даних забезпечує схоронність користувацької інформації між сесіями роботи мобільного додатка. Без цієї технології кожен запуск програми починався б з чистого аркуша — налаштування, історія та завантажені файли губилися б при закритті. За даними 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також