Skip to main content

SharedPreferences

SharedPreferences: Interface for accessing and modifying preference data returned by Context.getSharedPreferences(String, int). (…) Modifications to the preferences must go through an Editor object to ensure the preference values remain in a consistent state and control when they are committed to storage.

As SharedPreferences servem para guardar e restaurar valores dentro do armazenamento alocado para a aplicação, sendo esses valores os primitivos discutidos na trivia de Kotlin.

Para se poder usar, tem-se que inicializar uma variável que represente um dos blocos de dados que poderemos usar. Criando um caso não exista, no processo, e caracterizado por uma String única do próprio, por isso, tem de ser constante e deveria ser diferente ao mostrado:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    // Criar o sharedpreferences, pode ser necessário importar o Context
    val sharedPrefs = getSharedPreferences("CONSTANT_KEY", Context.MODE_PRIVATE)
}

Sendo que poderemos obter os dados deste bloco a partir do método .get:

var textoGuardado = sharedPrefs.getString("chave", "default")

Sendo que precisa de uma chave única, específica e constante para o dado que se esteja a restaurar e de um valor defeito ou default caso não exista previamente.

Editar

Para editar os valores, é preciso chamar o editor e posteriormente dar apply do valor.

val editor = sharedPrefs.edit()
editor.putString("chave", "outro valor")
editor.apply()

Neste caso se chama o editor para alterar qualquer que seja o valor que estivesse alocado para a chave "chave" por "outro valor". O apply indica ao programa para salvar as alterações o mais cedo possível, a fim de evitar qualquer problema na sincronização com outros processos que estejam a correr no background.

Exemplo

Neste exemplo, tem-se que ao carregar num botão, o texto é alterado e ao mesmo tempo guardado com um valor incrementado. Ao mesmo tempo, quando se inicia a atividade, o texto é restaurado da sessão anterior:

// Chaves para serem usadas no SharedPreferences
val chaveShared = "CONSTANT_KEY"
val chaveInteiro = "inteiro"
val chaveTexto = "texto"

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // Iniciar sharedprefs
    val sharedPrefs = getSharedPreferences(
        chaveShared, 
        Context.MODE_PRIVATE
    )

    // Iniciar a view, restaurando a sessão anterior
    val txtView : TextView = findViewById(R.id.txt_view)
    txtView.text = sharedPrefs.getString(chaveTexto, "Carregado 0 vezes")
    val btnView : Button = findViewById(R.id.btn_view)

    // Quando se carrega no botão, é incrementado o valor guardado,
    // mostrado no txtView e guardado no sharedPrefs
    btnView.setOnClickListener {
        var inteiro = sharedPrefs.getInt(chaveInteiro, 0)

        inteiro += 1

        txtView.text = "Carregado $inteiro vezes"

        val editor = sharedPrefs.edit()
        editor.putString(chaveTexto, txtView.text.toString())
        editor.putInt(chaveInteiro, inteiro)
        editor.apply()
    }
}