Middle
Kaip įgyvendinti duomenų talpyklos mechanizmą Android programoje?
sobes.tech AI
Atsakymas iš AI
„Android“ talpyklės mechanizmas gali būti įgyvendintas keliais būdais, pasirenkant tinkamiausią priklausomai nuo duomenų tipo ir jų gyvavimo ciklo.
Pagrindiniai požiūriai:
- Vidinė saugykla (Internal Storage): Tinka jautriems duomenims, prieinamiems tik programai. Duomenys saugomi privačiame kataloge.
- Išorinė saugykla (External Storage): Naudojama mažiau jautriems duomenims, kuriuos gali skaityti kitos programos ar vartotojas. Reikalauja leidimų.
- Shared Preferences: Idealiai tinka mažo kiekio paprastų "raktas-reikšmė" duomenų saugojimui, pvz., programos nustatymai.
- SQLite duomenų bazės: Galingas sprendimas struktūrizuotiems duomenims, leidžiantis vykdyti sudėtingus užklausimus. Android palaiko SQLite.
- Talpyklos katalogas: Specialiai skirtas laikiniems duomenims. Sistema gali ištrinti šiuos failus, jei reikia laisvos vietos.
Pavyzdys, kaip naudoti vidinę saugyklą talpyklai:
// Talpyklos failo gavimas
val cacheFile = File(context.cacheDir, "my_cached_data.txt")
// Duomenų įrašymas į talpyklą
try {
FileOutputStream(cacheFile).use { fos ->
fos.write("Talpyklos duomenys".toByteArray())
}
} catch (e: IOException) {
// Klaidos apdorojimas
}
// Duomenų skaitymas iš talpyklos
try {
FileInputStream(cacheFile).use { fis ->
val data = fis.readBytes().toString(Charsets.UTF_8)
// Naudojimas talpykloje esančių duomenų
}
} catch (e: IOException) {
// Klaidos apdorojimas, galbūt talpykla tuščia arba neprieinama
}
// Talpyklos failo ištrynimas
cacheFile.delete()
Shared Preferences pavyzdys:
// Shared Preferences instancijos gavimas
val sharedPref = context.getSharedPreferences("my_cache_prefs", Context.MODE_PRIVATE)
// Duomenų įrašymas
with(sharedPref.edit()) {
putString("cached_key", "cached_value")
apply()
}
// Duomenų skaitymas
val cachedValue = sharedPref.getString("cached_key", null)
// Naudojimas cachedValue
// Duomenų ištrynimas
with(sharedPref.edit()) {
remove("cached_key")
apply()
}
Dažnai naudojamos bibliotekos, tokios kaip Room, kurios yra Android Architecture Components dalis, skirtos darbui su SQLite.
// Pavyzdys naudojant Room: entiteto apibrėžimas
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
val name: String,
val age: Int?
)
Kashavimo strategijos:
- Cache-Aside: Programos pirmiausia tikrina cache. Jei duomenys yra, jie naudojami. Jei ne, duomenys įkelti iš šaltinio (pvz., tinklo) ir įdedami į cache ateities užklausoms.
- Read-Through: Biblioteka ar karkasas (pvz., OkHttp tinklo užklausoms) automatiškai valdo cache. Užklausos metu biblioteka tikrina cache, ir jei duomenys nėra arba pasenę, juos įkelia iš šaltinio ir atnaujina cache.
- Write-Through: Duomenys pirmiausia įrašomi į cache, o tada vienu metu įrašomi į pagrindinį šaltinį.
- Write-Back: Duomenys pirmiausia įrašomi tik į cache. Pakeitimai vėliau įrašomi į pagrindinį šaltinį (pvz., duomenų bazę), galbūt, kai cache užpildomas arba pagal tvarkaraštį.
Pasirinkimas strategijos ir metodo priklauso nuo duomenų aktualumo, našumo ir saugomų duomenų kiekio reikalavimų. Taip pat svarbu apsvarstyti TTL (Time To Live) cache'intiems duomenims, siekiant užtikrinti jų aktualumą.