Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Como obeter o ID de um componete Spinner(Android) para inserir no banco de dados.

Olá,

Estou com o seguinte problema em pegar o ID de um Spinner para inserir no banco de dados. Eu tenho uma tabela no banco de dodos que tem uma coluna com ID(Tipo: INTEGER) e outra com o NOME(Tipo: TEXT). Tenho uma segunda tabela que tem uma chave estrangeira que é interligada com a primeira tabela, e essa infomação da chave estrangeira é obtida através do componente Spinner.

O retorno que tenho do Spinner é null ao inserir no banco de dados.

Segue o código abaixo.

Método que pega os dados do banco de dados(SQLite) e popula no Spinner. Está funcionando normalmente!

private void popularListaUnidadeFuncionalSpinner() {
        try {
            TipoOcorrenciaDAO tipoOcorrenciaDAO = new TipoOcorrenciaDAO(this);
            List<TipoOcorrenciaTO> listaTipoOcorrencias = tipoOcorrenciaDAO.listarTiposCorrencias();
            ArrayAdapter<TipoOcorrenciaTO> adapter = new ArrayAdapter<TipoOcorrenciaTO>(this, android.R.layout.simple_list_item_1, listaTipoOcorrencias);
            spinnerTipoOcorrencia.setAdapter(adapter);
        } catch (Exception erro) {
            System.out.println("Erro : " + erro.getMessage());
        }
    }

Essa minha classe Helper que tem a função de pegar o item selecionado no Spinner.


    private EditText nome;
    private Spinner idOcorrenciaItem;
    private TipoOcorrenciaItemDAO tipoOcorrenciaItemDAO;

    public TipoOcorrenciaItemBO(AppCompatActivity tipoOcorrenciaItemActivity) {
        tipoOcorrenciaItemDAO = new TipoOcorrenciaItemDAO(tipoOcorrenciaItemActivity);


        nome = (EditText) tipoOcorrenciaItemActivity.findViewById(R.id.tipo_ocorrencia_form_edit_add_nome);
        idOcorrenciaItem = (Spinner) tipoOcorrenciaItemActivity.findViewById(R.id.tipo_ocorrencia_item_spinner_add_tipo_ocorrencia);
    }

    public TipoOcorrenciaItemTO pegarDadosDaViewCadastro(TipoOcorrenciaItemTO tipoOcorrenciaItemTO) {
        tipoOcorrenciaItemTO.setNome(nome.getText().toString());
        tipoOcorrenciaItemTO.setIdTipoOcorrencia((Long) idOcorrenciaItem.getSelectedItem());
        return tipoOcorrenciaItemTO;
    }

Responsável por inserir no banco de dados.

    public static final String TABELA_NOME = "tipo_ocorrencia_item";
    public static final String COLUNA_ID = "id";
    public static final String COLUNA_TIPO_OCORRENCIA_ID = "tipo_ocorrencia_id";
    public static final String COLUNA_NOME = "nome";
    public static final String COLUNA_E_PRINCIPAL = "e_principal";

    public void incluir(TipoOcorrenciaItemTO tipoOcorrenciaItemTO) {
        try {
            SQLiteDatabase database = getWritableDatabase();
            ContentValues dados = new ContentValues();
            dados.put(COLUNA_NOME, tipoOcorrenciaItemTO.getNome());
            dados.put(COLUNA_E_PRINCIPAL, tipoOcorrenciaItemTO.getePrincipal());
            dados.put(COLUNA_TIPO_OCORRENCIA_ID, tipoOcorrenciaItemTO.getIdTipoOcorrencia());
            database.insert(TABELA_NOME, null, dados);
        } catch (SQLException erro) {
            System.out.println(R.string.feedback_erro_salvar_bd + erro.getMessage());
        }
    }

Aqui está meu código completo. https://github.com/khalleb/appFormularioOcorrencia/tree/khalleb

Desde já, muito obrigado.

5 respostas

Oi Khalleb tudo bem ?

O Spinner, é tipo uma ListView, até usa o mesmo conceito de adapter, justamente para você pegar o objeto e dele manipular as informações que necessita.

Imagino que ele não esteja conseguindo fazer o cast, e ai o valor apresentado seja nulo :(

Matheus, você poderia me passar um exemplo de como fazer isso? No que pude pesquisar na internet, não consegui identificar uma solução para o meu problema.

Você consegue usar um listener para pegar o que deseja, por exemplo, toda vez que for clicado você pode fazer um tratamento.

Para isso existe o método onItemSelected da interface OnItemSelectedListener

Matheus, eu entendi o onItemSelected onde posso pegar a posição. Eu fiz como mostro o código abaixo, mas nesse caso está pegando a posição(que no caso a posição do array) do meu Spinner quando selecionado. Minha dúvida é, como estou populando o Spinner com informações do banco dados, preciso que quando selecionar um item do Spinner seja pego o seu ID que está no banco para salvar como uma chave estrangeira.

Estou te passando um link de duas imagens para melhor entendimento.

Imagem 01 Imagem 02

 public void pegaDaDoSpinner() {
        spinnerIDOcorrenciaItem.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                try {
// ESTÁ PEGANDO A POSIÇÃO DO ITEM SELECIONADO NO SPINNER, NO CASO A POSIÇÃO DO ARRAY E NÃO A DO BANCO DE DADOS.
                    spinnerID = spinnerIDOcorrenciaItem.getItemIdAtPosition(position) + 1;           
               } catch (Exception erro) {
                    System.out.println("Erro : " + erro.getMessage());
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
solução!

Oi Khalleb, tudo bem ?

Invés de usar o método getItemIdAtPosition você pode usar o método getItemAtPosition que vai devolver o objeto inteiro, dele provavelmente você terá o id do banco.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software