Uložení dat pomocí SharedPreferences
SharedPreferences je třída, která umožňuje ukládat data v podobě klíč-hodnota. Tedy podobný princip jak běžná mapa (např. Hashmap). Myšlenkou SharedPreferences je uložení jednoduchých hodnot (String, Boolean, Int, Long,…) které potřebujeme uchovat i po vypnutí aplikace.
Data jsou uložena do XML souboru, který je při načítání a ukládání hodnot vždy otevřen a následně ukončen.
Nejběžnějšími příklady použití jsou:
- uložení informace o prvním spuštění aplikace.
- uložení přihlašovacího tokenu (při komunikaci s REST API)
- uložení nastavení aplikace (preference uživatele)
Práce s SharedPreferences
Velice užitečné je obalení třídy vlastní třídou, která slouží jak rozhraní pro práci s ní. Třída může být statická (v kotlinu companion object). Díky tomu nemusíme vytvářet instanci.
class SPUtil {
companion object {
private const val SP_FILE = "sp_file_name"
private fun getSharedPreferences(context: Context)
: SharedPreferences{
return context.getSharedPreferences(
SP_FILE, Context.MODE_PRIVATE)
}
fun writeBoolean(context: Context,
key: String,
value: Boolean){
with (getSharedPreferences(context).edit()) {
putBoolean(key, value)
commit()
}
}
fun readBoolean(context: Context,
key: String): Boolean {
return getSharedPreferences(context).getBoolean(key, true)
}
}
}
V kódu je private metoda getSharedPreferences, která umožňuje získat vždy ten stejný objekt a pak metody writeBoolean a readBoolean, které zapíší a čtou true/false hodnotu z SharedPreferences.
commit() vs. apply()
Při ukládání hodnoty máme na výběr ze dvou metod, commit nebo apply. Commit uloží hodnotu hned a apply uloží hodnotu asynchronně. Podle googlu je doporučené použit apply, zkušenosti ovšem radí commit. Tím, že je apply asynchronní nemusí dojít k okamžitému uložení hodnoty, což ve většině případů nevadí. Nicméně jsou situace, kdy to může být problémové a je nutné na to pamatovat.
Zdroje:
https://developer.android.com/reference/android/content/SharedPreferences
https://developer.android.com/training/data-storage/shared-preferences
https://developer.android.com/reference/android/content/SharedPreferences.Editor