Banco de dados para Android

Banco de dados para android sqlite3

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

 

SQLite3

Um Banco de dados é muito útil para qualquer sistema de grande ou pequeno porte, a não ser que seu sistema lida apenas com dados simples, não utilizando de um banco para armazenar informações.

O Android usa o banco de dados SQLite que é open-source, o SQLite é muito utilizado em aplicações populares. Outros exemplo de quem utiliza o SQLite é Mozilla Firefox e iPhone.

No Android o banco de dados que você cria em uma aplicação só é acessível para si mesma, a não ser que você utiliza um provedor de conteúdo (assunto a ser discutido em outro post), uma vez criado o banco de dados, ele é armazenado no diretório “/data/data/{nome do pacote}/databases/{nome do banco}”, alem de gerenciar o banco por código você pode faze-lo pelo adb(clique para saber mais) utilizando a ferramenta sqlite3.

Exemplo:

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

A Aplicação

Vou implementar um exemplo bem simples sem a utilização de interface, só com visualização no Log. Primeiro vamos definir nosso banco de dados, vou fazer o SQL em um arquivo (diferente de muitos exemplos) e depois carregar no código, eu prefiro assim pois acredito que tem mais controle e fica mais organizado. Após sera implementado as classes de controle do banco e por fim vamos utiliza-las.

Defini a estrutura dos pacotes da seguinte maneira (com suas classes):

No arquivo create.sql vamos definir as tabelas de nosso database:

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Após a definição do banco vamos criar a classe de mais baixo nível, a BancoManager.java. Essa classe vai ser uma classe abstrata responsável em criar o banco e ter o controle de versão dele, iremos utilizar como classe pai SQLiteOpenHelper.java que é nativa do Android e tem a finalidade de gerenciamento.

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Como vemos essa classe não faz nada se ninguém implementar, nela temos um método abstrato onCreate e onUpgrade, ambas precisam ser implementadas para que a coisa toda funcione, o método onCreate ficará responsável em criar o banco, caso o banco já exista nada será alterado, o método onUpgrade é utilizado para atualizar a base da dados, caso alguma tabela seja alterada, mas nada acontece automaticamente devemos implementa-la de forma correta, esse método será chamado automaticamente caso a versão que é passada no contrutor sejá alterada.

Antes de implementar a BancoManager, vamos implementar a classe Banco.java, nela podemos abstrair muita informação, fiz ela o mais simples possível, mas podemos tratar os insert,update,delete,select nesta classe de uma forma bem abstrata para que haja a melhor orientação possível. Entenda que essa classe sera responsável em gerenciar a conexão do banco.

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Vamos usar a BancoManager.java como explicado anteriormente. Criei o BancoUsuarios.java que irá tratar da criação do nosso banco e atualização.

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Como vimos implementamos tudo que é necessário para a criação e atualização do banco. Caso alguém não saiba a classe Log.java é responsável em escrever no DDMS(aprenda a usar) que é nosso gerenciador de log de eventos, ninguém que programa em android vive sem o DDMS.

Agora que criamos toda nossa estrutura, construímos nosso alicerce, vamos mostrar nossa classe MainActivity.java por partes, definimos a estrutura da seguinte maneira:.

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Temos nossa tag de log e nosso Banco definido anteriormente.

O método onCreate vamos fazer toda chamada, iniciar o banco chamar os métodos etc…

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //inicia e abre banco
        banco = new Banco(new BancoUsuarios(this));
        banco.open();
        //inicia o exemplo (insert,select,update,delete)
        Log.d(TAG_LOG, "\nINSERT");
        //insiro o usuario
        insert("gbzarelli");
        //insiro o usuario
        insert("registro_" + System.currentTimeMillis());
        select();//busco

        Log.d(TAG_LOG, "\nUPDATE");
        String update = "gbzarelli_" + System.currentTimeMillis();
        //atualizo o nome
        update("gbzarelli", update);
        select();//busco

        Log.d(TAG_LOG, "\nDELETE");
        delete(update);//deleto o registro
        select();//busco

        banco.close();//fecha o banco
    }

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

Acredito que até ai não tenha segredo, estamos inserindo dois usuários, um com o parâmetro “gbzarelli” e o outro “registro_xxxxxx” (esse parâmetro vai ser o usuário), após ter inserido fazemos um update mudando o usuário de “gbzarelli” para “gbzarelli_xxxxxx” e por fim fazemos um delete no usuário que foi alterado. Entre essas operações estamos realizando um select para mostrar as informações.

O Insert – Notamos que utilizamos uma classe chamada ContentValues que serve para linkar a coluna com o registro, essa classe é como se fosse um hashmap. Após o registro ser inserido é retornado um long que é respectivo ao id primário da tabela.

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

 

    private void insert(String usuario) {
        //inserir dados
        ContentValues cv = new ContentValues();
        cv.put("usuario", usuario);
        cv.put("senha", "147147");
        cv.put("nome_completo", "Guilherme Biff Zarelli");
        long l = banco.get().insert("usuarios_tbl", null, cv);
        Log.i(TAG_LOG, "id insert: " + l);
    }

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

O Select – Aqui usamos  uma query comum, realizada na mão e passamos os parâmetros através de um array de string cada posição é respectiva com a ordem dos pontos de interrogação. Vemos também o uso do Cursor que é referente ao ResultSet utilizado no JavaSE.

    private void select() {
        //O cursor no android é similar ao ResultSet do Java
        Cursor cursor = banco.get().rawQuery("select * from usuarios_tbl limit ?", new String[]{"5"});
        while (cursor.moveToNext()) {
            Log.i(TAG_LOG, "id: " + cursor.getInt(cursor.getColumnIndex("id_usuarios")));
            Log.i(TAG_LOG, "usuario: " + cursor.getString(cursor.getColumnIndex("usuario")));
            Log.i(TAG_LOG, "senha: " + cursor.getString(cursor.getColumnIndex("senha")));
            Log.i(TAG_LOG, "nomeCompleto: " + cursor.getString(cursor.getColumnIndex("nome_completo")));
            Log.i(TAG_LOG, "-------");
        }
        //Nunca esqueça de feixar o cursor.
        cursor.close();
    }

O Update – Também utilizamos o ContentValues e o array de parâmetros

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

O Delete – No delete passamos a tabela e a condição e também o array de parâmetros.

    private void delete(String usuario) {
        banco.get().delete("usuarios_tbl", "usuario==?", new String[]{usuario});
    }

Pronto, na implementação podemos notar que existe várias de maneiras de fazer um select,insert,update ou delete, a classe SQLiteDatabase é bem complexa e cheio de métodos, somente com a prática podemos criar um controle agradável e bem usual. Agora basta estudar e ir aprimorando seu código.

Se rodarmos vamos notar no DDMS mais ou menos o seguinte Log:
Log DDMS banco de dados sqlite3

Caso queiram o projeto segue o link: ProjetoExemploBanco , o projeto foi realizado no NetBeans sobre o Fedora 16 x64 e configurado para a versão 3.2 do Android.

Caso queira usar o NetBeans como sua IDE de Android faça os seguintes procedimentos (AQUI).

Mudamos veja em: http://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

15 comentários sobre “Banco de dados para Android

  1. Pingback: Android – Opções de Armazenamento (persistência de dados) « Think Different – Develop

  2. Ótimo post.. me ajudou bastante.. muito legall seu blog está de parabéns

  3. Tenho uma duvida , como faço a criação deste arquivo com a extensão .sql?

    • Crie no proprio bloco de notas caso você esteja usando windows e ao salvar voce coloca em tipo de arquivo: “todos os arquivos” e o nome voce coloca “arquivo.sql” ai ele nao vai salvar como txt mais sim como sql.

      • Obrigado pela a resposta , agora eu tenho mais uma duvida , onde fica salvo o arquivo do banco que eu acabei de criar! pois eu necessito testar minhas pesquisas por uma ferramenta CASE chamada SQLite Expert Personal

      • O arquivo do banco fica salvo aonde sua aplicação foi instalada normalmente em “/data/data//arquivodobanco.db” você só tera acesso a essa pasta em um dispositivo se o mesmo estiver com root.

  4. mto bom o artigo que vc escreveu, porem quand eu tento dah um erro de no such table nao existe a tabela, Tipo tenho 2 activity eu abro o banco na activity de cadastro de cliente. mas ele sempre dah o mesmo erro. se puder dar um help eu agradeceria mtoooo

  5. Gostaria muito de saber o seguinte: tenho um aplicativo para web – WebMasterLite – e o Mysql Manager para visualizar as páginas php. Só que não estou conseguindo configurar o Mysql Manager. Mim ajude na configuração. Obrigado!

  6. Oi gilherme desculpe a demora pra resposta. Vi q android funciona um pouco diferente de um apicativo java comum. è mais a questao dos objetos que não vi como que ele seta os atributos do objeto. Pra qua busca eu sempre faça pelos objetos. Como seta os atributos à classe??

    • Caio, o Android funciona igual ao Java porem tem um conceito diferente em relação a interface. Você seta os atributos de uma classe pelos métodos get’s e set’s normalmente identico ao java. O que seria uma classe para você? de qual classe especificamente você se refere ?… esclareça sua pergunta, obrigado.

  7. Pingback: Banco de dados para Android « Arthur Lehdermann

  8. Sou nova com desenvolvimento para Android. Lendo seus posts resolvi criar um aplicativo experimental, só que surgiu uma dúvida
    Minha dúvida é como eu faço para criar um banco de de Dados com informações só para serem acessadas(consultadas)
    Por exemplo tenho 3 spinners e um botão. Vou colocar um exemplo
    na 1º Spinner eu teria opções de escola, hospitais, praças (Lugares Públicos)…
    na 2º Spinner eu teria as opções de zonas da cidade,( zona 1, zona2, zona3..)
    na 3º spinner os principais os bairros da cidade( bairro A, bairro B…)
    se a spinner 1 eu escolher Escola
    e a spinner 3 eu escolher o Bairro A,
    e a pessoa clicar no botão pesquisar
    como eu faço para na próxima tela apresentar todas as escolas do Bairro A ??
    Não é pra inserir nada, queria saber como faz um banco de dados apenas para consultar dados inseridos!
    De modo que quando alguém selecionar o Bairro A, na tela seguinte faria uma query sobre esses dados (ex. select * from escola where bairro = ‘A’)
    Como eu faço isso??

    • Todas essas perguntas da para responder neste post. O mais importante que você quer saber é como criar um banco de dados com dados já inserido.. seguindo a explicação do post basta você criar o arquivo .sql na pasta raw do projeto. Neste arquivo, basta ter o create do banco e a inserção dos registros como no exemplo abaixo:

      ===========arquivo .sql============
      CREATE TABLE usuarios_tbl (
      id_usuarios INTEGER PRIMARY KEY autoincrement,
      usuario varchar(45) NOT NULL ,
      senha varchar(45) NOT NULL,
      nome_completo varchar(45) NOT NULL
      );

      INSERT INTO usuarios_tbl(id_usuarios, usuario, senha, nome_completo) VALUES(1,”gui”,”123″,”guilherme biff”);
      …[insert]
      …[insert]
      …[insert]
      ==================================

      pronto usando a classe do exemplo, você terá seu banco com registros.

      O resto já parte para um conceito de regra de negocios…
      Para utilizar um Spinner é simples, tendo o array de elementos basta fazer:

      String[] itens = new String[]{“a”,”b”};
      ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, itens);
      spinner.setAdapter(adapter);

      Para descobrir qual item você selecionou no spinner basta implementar o listener de item selecionado:

      spinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {

      public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) {
      adapter.get(arg2);//pronto você tem o item.
      //aqui você pode chamar uma função para carregar os dados do outro spinner.
      }
      });

      Para passar parametros entre telas faça:
      Intent it = new Intent(this,Tela2.class);
      it.putExtra(“dado1”, “valor1”);
      it.putExtra(“dado2”, “valor2”);
      startActivity(it);

      Para capturar esses dados:
      getIntent().getStringExtra(“dado1”);

Deixar mensagem para Guilherme Biff Cancelar resposta