Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Context utilizado

Olá,

Gostaria de saber qual a melhor abordagem para utilização do context para criação do banco de dados e também da variável String com o nome dele.

Costumo utilizar o padrão de projeto MVP, então possuo uma classe denominada "App", onde consigo obter o context da aplicação.

Por exemplo, em meu código, configurei da seguinte forma:

public static MyRoomDatabase getDatabaseInstance() {
        return Room.databaseBuilder(
                App.getContext(),
                MyRoomDatabase.class,
                App.getContext().getString(R.string.database_name)
        ).allowMainThreadQueries().build();
    }

Classe App:

public class App extends Application {

   private static Application application;

    private static Application getApplication() {
        return application;
    }

    public static Context getContext() {
        return getApplication().getApplicationContext();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        application = this;
    }

}

Esta é uma boa prática, ou devo utilizar a maneira abordada no vídeo (para o nome do database criou-se um atributo da classe database como private static final string, e para obtenção da instância do banco de dados utilizou-se a passagem do context via parâmetro)

Obs.: Acredito que desta maneira conseguirei fazer a operação no banco de dados mesmo se a tela (context enviado como parâmetro) não existir mais.

1 resposta
solução!

Oi Marcelo, minha sugestão é sempre evitar trabalhar com métodos estáticos, principalmente ao lidar com Context no Android.

Entendo que o Context estático ajude bastante no dia a dia, onde é bastante comum nos perguntarmos "poutz, de onde que eu vou pegar um context?", mas essa prática acaba comprometendo bastante a testabilidade dos nossos métodos.

Um método que usa um context estático não é possível ser testado via JUnit nem Robotium, por dois grandes motivos: 1- eles não permitem mockar elementos estáticos 2- ainda que fosse possível esse mock, não teríamos como injetá-lo no nosso método a ser testado, pois o context não está sendo setado via parâmetro (afinal, se ele é estático, pra que setá-lo via parâmetros?)

Por isso eu recomendo sempre passar Context via parâmetro.