Sobes.tech
Junior

Como é que se podem guardar dados fora do fragmento?

sobes.tech IA

Resposta da IA

Existem várias formas de guardar dados fora de um fragmento:

  • ViewModel: Ideal para armazenar dados relacionados com a interface de utilizador de forma consciente do ciclo de vida. Sobrevive a alterações de configuração.

    class MyViewModel : ViewModel() {
        var data: String = ""
    }
    
  • Activity: Os fragmentos podem interagir com a atividade contenedora (por exemplo, através de uma interface ou diretamente), onde a atividade pode armazenar dados.

    // Na Activity
    var sharedData: String = ""
    
    // No Fragment
    (activity as? MyActivity)?.sharedData = "Guardado do fragmento"
    
  • Shared Preferences: Método simples para armazenar dados primitivos (pequenos volumes).

    // No Fragment
    val sharedPref = activity?.getSharedPreferences("my_prefs", Context.MODE_PRIVATE) ?: return
    with(sharedPref.edit()) {
        putString("saved_string", "Meus dados")
        apply() // Ou commit() para escrita síncrona
    }
    
  • SQLite Database: Para dados estruturados e consultas mais complexas.

    -- Exemplo SQL
    CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT);
    
  • Room Persistence Library: Abstração sobre SQLite que facilita o trabalho com bases de dados.

    // Exemplo de entidade Room
    @Entity
    data class User(
        @PrimaryKey val id: Int,
        val name: String
    )
    
  • DataStore: Alternativa moderna ao Shared Preferences, permitindo armazenar dados de forma assíncrona e segura.

    // Exemplo de DataStore Prefs
    val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
    
    // No Fragment
    context?.dataStore?.edit { settings ->
        val currentCounter = settings[EXAMPLE_COUNTER] ?: 0
        settings[EXAMPLE_COUNTER] = currentCounter + 1
    }
    
  • Armazenamento interno/externo: Para guardar ficheiros.

    // Escrever num ficheiro
    val filename = "my_data.txt"
    val fileContents = "Olá, mundo!"
    context?.openFileOutput(filename, Context.MODE_PRIVATE)?.use {
        it.write(fileContents.toByteArray())
    }
    
  • Singleton: Instância global de uma classe para armazenar dados, acessível de qualquer lugar na aplicação. Deve ser usado com cautela devido a potenciais problemas com testes e fugas de memória.

    object DataManager {
        var sharedData: String = ""
    }
    
  • Classe Application: Classe que estende Application, é global para toda a aplicação e pode armazenar dados.

    class MyApp : Application() {
        var globalData: String = ""
    }