GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Melhor Lógica para gerenciar configuraçoes em meu android app

java
mobile
logica
android
Tags: #<Tag:0x00007f2ca6e893e0> #<Tag:0x00007f2ca6e892a0> #<Tag:0x00007f2ca6e89160> #<Tag:0x00007f2ca6e89020>

#1

Olá senhores(as), tenho um app que deveria lidar com configurações, ideia essa que está me dando muita dor de cabeça apesar de ser algo bem simples. Inicialmente eu salvava as configurações no banco de dados assim como os dados do app mais após pesquisar um pouco na internet vi que o mais recomendado era usa as shared preferences, oque me ajudou muito mais agora o problema é outro: Eu simplesmente não estou sabendo como manusear essas novas informações dentro do app. Quando eu salvava esses dados no DB eu usava um objeto “Configuraçoes” que tinha como atributos as variáveis que “seguravam” as configuraçoes, mas ao passar para o shared preferences eu decedi começar a usar CONSTANTES. Veja minha classe de configuraçoes abaixo:

/**
* Created by Gilian Marques on 09/10/2016.
*/
public class Configuraçoes implements Serializable {
private static Configuraçoes Instancia = null;
private Context mContext;
private ConfRW writer;

public static Configuraçoes getInstancia(Context mContext) {
    if (Instancia != null) {
    } else {
        Instancia = new Configuraçoes(mContext);
    }

    return Instancia;
}

private Configuraçoes(Context mContext) {
    this.mContext = mContext;
    writer = new ConfRW(mContext);
}

    //usa a classe ConfRW para ler as configuraçoes em SharedPreferences
public String getValue(String ID) {
    return writer.rData(ID);
}

public boolean getBooleanValue(String ID) {
    return Boolean.parseBoolean(writer.rData(String.valueOf(ID)));
}

/**
 * obtem o INTEIRO correspondente a CHAVE recebida
 *
 * @param ID a chave
 * @return se o valor for nulo retorna 0, senao o valor da chave
 */
public int getIntegerValue(String ID) {
    String i = writer.rData(String.valueOf(ID));
    return i == null ? 0 : Integer.parseInt(i);

}

// POLIMORFISMO
//usa a classe ConfRW para escrever as configuraçoes em sharedPreferences
public void setValue(String ID, String value) {
    writer.wData(ID, value);
}

public void setValue(String ID, boolean value) {
    writer.wData(ID, String.valueOf(value));
}

public void setValue(String ID, int value) {
    writer.wData(ID, String.valueOf(value));
}


// Constantes de acesso

/*LÓGICA
* Os valores das configuraçoes ficam salvas em SharedPreferences KEY-VALUE, onde
* KEY é o nome contido nessas constantes e VALUE é o valor que ta no armazenamento.
* Pra setar um valor eu passo a constante (KEY) e o respectivo valor (VALUE) e pra obter o valor de uma constante
* eu passo apenas  a constante e o valor me sera retornado.
* */
public static String NOT_DEBIT_ATR = "NOT_DEBIT_ATR";
public static String NOT_DEBIT_PROX = "NOT_DEBIT_PROX";
/*definem se sao dadas as notificaçoes dos proximos debitos e atrasados  SALVAM VALORES BOOLEANOS*/
//
public static String DATA_CHART = "DATA_CHART";
/*define o tipo de dados que deve ser carregado pelo grfico de pizza: 1 todos os debitos, 2 só os pagos, 3 só os em aberto*/
//
public static String BOOT_SHEET = "BOOT_SHEET";
/*A folha que deve ser aberta no boot do app*/
//
public static String FIRST_BOOT = "FIRST_BOOT";
/*Primeiro boot?*/
//
public static String AUTOMATIC_BACKUP = "AUTOMATIC_BACKUP";
/*Define se esta habilitado ou não o backup de dados automatico*/
//
public static String DEBIT_CARD_DATA_FROM_ALL = "DEBIT_CARD_DATA_FROM_ALL";
/*Define se o card de prox e atr debitos mostra apenas os debitos da folha atual ou de todas as folhas*/
//
public static String VIEW_FOLHA_CHART = "VIEW_FOLHA_CHART";
/*define se o grafico chart de estatisticas da folha deve ser mostrado no frag Estatisticas*/

public static String VIEW_CAT_CHART = "VIEW_CAT_CHART";
/*define se o grafico chart de estatisticas das categorias deve ser mostrado no frag Estatisticas*/

public static String VIEW_FOLHA_STATS1 = "VIEW_FOLHA_STATS1";
/*define se o grafico de estatisticas da folha  deve ser mostrado no frag Estatisticas*/

public static String VIEW_FOLHA_STATS2 = "VIEW_FOLHA_STATS2";
/*define se o grafico de estatisticas da folha  deve ser mostrado no frag Estatisticas*/

public static String NOT_HORARY_AM = "NOT_HORARY_AM";
/*define  as horas em que sera disparada a notificaçao dos debitos (prox-atr) na parte da manha*/

public static String NOT_HORARY_PM = "NOT_HORARY_PM";
/*define  as horas em que sera disparada a notificaçao dos debitos (prox-atr) na parte da tarde*/

public static String SORTING_BY = "SORTING_BY";
/*define  por qual fator os debitos deverao ser ordenados*/
public static String SORTING_MODE = "SORTING_MODE";
/*define se se o ordenamento sera em crescente ou decrescente*/


//Constantes
//essas constantes definem pelo que serao ordenados
public static int SORT_BY_ID = 0;           // nome
public static int SORT_BY_DATE = 1;         //data de pagamento
public static int SORT_BY_STATE = 2;        //em aberto/pago
public static int SORT_MODE_CRESCENT = 0;   //crescente
public static int SORT_MODE_DECRESCENT = 1; //decrescente

Dessa forma salvo um dado desse forma:

        `Configuraçoes c = Configuraçoes.getInstancia(mContext);
         c.setValue(c.SORTING_BY,c.SORT_BY_ID)`;

e leio da seguinte forma:

            `if (c.getIntegerValue(c.SORTING_BY) == c.SORT_BY_ID) {_
      //faço alguma coisa de acordo com essa configuração
         }`

E aqui a classe ConfRW que le e escreve em sharedPreferences

private SharedPreferences prefs;

public ConfRW(Context mContext) {
    this.mContext = mContext;
    prefs = PreferenceManager.getDefaultSharedPreferences(mContext);
}


/**
 * escreve a configuraçao  recebida como parametro
 */
public void wData(String id, String value) {
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(id, value);
    editor.commit();
}

/**
 * le  a configuraçao  recebida como parametro
 * @param id a id da configuraçao recebida
 * @return o valor da configuraçao ou NULL
 */
public String rData(String id) {
    try {
        return prefs.getString(id, null);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

}
Acredito não ter muito para explicar já que o código esta auto-comentado e com javadocs. O problema de fazer dessa forma é que eu salvo qualquer tipo em forma de string e na hora de recuperar esses valores através da constante eu acabo não sabendo qual tipo primitivo de valor recuperar fora que são muitas constantes e no geral já ta virando bagunça.

SENHORES, como fazem pra lidar com as configurações em seus apps? e por que fazem da forma que fazem? OBS.: Eu até usaria ENUMS porém de acordo com esse vídeo https://www.youtube.com/watch?v=Hzs6OBcvNQE&index=21&list=PLOU2XLYxmsIKEOXh5TwZEv89aofHzNCiu não é uma boa idéia ja que enums são muito pesados e eu já to começando a ter dor de cabeça com OOM, obrigado a todos.