Трајно чување података обезбеђује очување корисничких информација између сесија рада мобилне апликације. Без ове технологије, свако покретање програма почињало би од нуле — подешавања, историја и преузети фајлови би се губили при затварању. Према подацима Google Developers, 2024, више од 90% мобилних апликација користи бар један механизам трајног чувања за очување корисничких података и стања интерфејса.
Главне тачке
Data Persistence — способност апликације да чува податке у неиспарљивој меморији уређаја. У мобилном развоју, трајно чување обухвата базе података, фајл систем, подешавања и кеш меморију. Сваки механизам има своје карактеристике перформанси, безбедности и обима ускладиштених информација.
Привремени подаци постоје само у RAM меморији и губе се при завршетку процеса. У њих спадају стање екрана, привремена израчунавања и кеш меморија слика. Трајни подаци се уписују у фајл систем или базу података и остају доступни након поновног покретања апликације. У њих спадају корисничка подешавања, токени за ауторизацију, историја операција и преузети садржај.
При избору начина чувања, програмер процењује неколико фактора. Тип података одређује структуру чувања: једноставна подешавања — 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 — уграђена релациона база података која ради унутар процеса апликације без посебног сервера. Ово је најраспрострањенији DBMS у мобилном развоју: подразумевано се користи на обе платформе. 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("Грешка при чувању: \(error)")
}
}
}
Чување фајлова (File Storage) користи се за чување слика, видеа и докумената. Android пружа интерну меморију (context.filesDir) — приватну за апликацију, и екстерну (Environment.getExternalStorageDirectory) — доступну другим апликацијама. На iOS-у фајлови се чувају у директоријумима Documents и Library, при чему је Library/Caches намењена кешу који се не бекапује у iCloud. За рад са фајловима обе платформе пружају File API и операције стримовног читања и писања. Модерне библиотеке попут Coil и SDWebImage додају слој кеширања, комбинујући фајл систем са RAM меморијом за оптималне перформансе.
На 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође