[Android Studio] Aula 12 – Agenda de Contatos – Implementando o Banco de dados com SQLite

Share Button

Olá pessoal,

Mais uma vídeo aula disponibilizada. Disponibilizei um pouco tarde aqui no blog pois tive alguns problemas com o servidor de hospedagem.

O que será apresentado:

  • Introdução o uso de banco de dados, utilizando o SQLite, banco de dados nativo da plataforma Android.
  • Demonstrando o uso das classes SQLiteOpenHelper e SQLiteDatabase.
  • Utilizando a ferramenta SQLite Studio para testar os scripts do banco de dados.

SQLite Studio: http://sqlitestudio.pl/
Script tabela Contato: http://goo.gl/pB7wPj

Críticas e sugestões serão bem vindas, pois somente assim podemos melhorar.

Comments

comments

16 Comments

  1. Boa noite

    Tentei de toda a maneira, e não esta dando certo a conexão com o banco de dados, oque pode ser?
    Daria para disponibilizar o projeto?

      1. Aparece assim..
        Conexão falhounear
        “NULLPRIMARY”: syntax error (code 1):, while compiling : CREATE TABLE IF NOT EXISTS CONTATO( _ id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,
        EMAIL VARCHAR (255),
        TIPOEMAIL VARCHAR (1),
        ENDERECO VARCHAR (255), TIPOENDERECO VARCHAR (1), DATASESPECIAIS DATE,
        TIPODATASESPECIAIS VARCHAR (1),
        GRUPOS VARCHAR (255) );

        1. Este erro acontece porque esta faltando um espaço no script.

          “NULLPRIMARY”: syntax error (code 1):

          Na vídeo aula eu falo para colocar um espaço no final de cada valor do objeto sqlBuilder. a partir do tempo 20:20.

          Em seu código deve estar assim

          StringBuilder sqlBuilder = new StringBuilder()
          sqlBuilder.append("CREATE TABLE IF NOT EXISTS CONTATO (");
          sqlBuilder.append("_id INTEGER NOT NULL");
          sqlBuilder.append("PRIMARY KEY AUTOINCREMENT,");

          Coloque um espaço no final de cada valor adicionado no objeto sqlBuilder. Faça isso em todas as linhas

          StringBuilder sqlBuilder = new StringBuilder()
          sqlBuilder.append("CREATE TABLE IF NOT EXISTS CONTATO ( ");
          sqlBuilder.append("_id INTEGER NOT NULL ");
          sqlBuilder.append("PRIMARY KEY AUTOINCREMENT, ");

  2. Bom dia Paulo..
    obrigado pelas vídeo aulas

    estou tendo um erro na conexão

    ” erro de conexão” no such table: CONTATO:,
    while compliling: INSERT INTO CONTATO(TELEFONE) VALUES(?)

    o que será o problema?

    grato…

    1. Esse problema ocorre porque a tabela do banco de dados não foi criada.
      Tente remover o aplicativo do emulador ou do smarthphone(se você estiver testando nele), após remover, teste o aplicativo novamente.
      Lembre-se também de verificar se no logcat não esta aparecendo mais erros alem desse que você monstrou.

  3. Paulo, se eu quiser por exemplo deixar um cadastro fixo no banco como Polícia 190 como eu faria para realizar esse insert e quando eu gerasse a apk o usuário baixasse o aplicativo com esse usuário já cadastrado?

    Obrigado

    1. Para realizar o cadastro basta no momento que criar o banco de dados você realizar a inserção dos dados, através do método onCreate, da mesma forma que é utilizado para criar o banco, utilizando o método execSQL.
      Exemplo:
      public void onCreate(SQLiteDatabase db) {
      db.execSQL(“INSERT INTO CONTATO(NOME, TELEFONE) VALUES(‘Polícia’, ‘190’)”);
      }

  4. Olá mestre tudo bem?!
    Suas aulas são perfeitas professor, muito obrigado por compartilhar seus conhecimentos.

    Prof. implementei um método para salvar os dados do banco no sdcard como forma de backup e também para restaurar em seguida e está tudo funcionando.

    Eu gostaria de fazer uma verificação antes de salvar os dados, criar uma condição se caso a tabela esteja vazia “null”, mas eu não faço a mínima ideia de como fazer isso já revirei tudo vasculhei muito vi vários exemplos mas não consigo implementar essa condição.

    por favor me de uma luz nisso professo prq já não sei mais que fazer.

    Fique com Deus
    Abrazz

    1. Para fazer isso é muito simples, basta verificar se existe registro na tabela utilizando um comando SQL. Por exemplo, vamos supor que sua tabela se chame CLIENTE,
      então o SQL será:
      Cursor cursor = db.rawQuery(“SELECT COUNT(*) AS TOTAL FROM CLIENTE”, null);

      if (cursor.getCount() > 0)
      {
      cursor.moveToFirst();

      if (cursor.getInt(0) > 0)

      //Coloque aqui o seu código
      }

      }

      1. Olá Professor Paulo, obrigado por me mostrar o caminho..

        Paulo eu criei um método conforme sua orientação e estou testando no projeto da série Agenda que vc nos ensina (já conclui todas as etapas de todos os vídeos). Mas eu sempre recebo esse erro:

        (java.lang.NullPointerException: Attempt to invoke virtual method ‘android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])’ on a null object reference)

        O que está errado com o método? eu teria que passar algum parâmetro no método?

        Segue abaixo como criei o método.

        //minha classe
        public class BackUpRestore {

        private SQLiteDatabase db;

        public void verificaDB() {
        Cursor cursor = db.rawQuery(“SELECT COUNT( *) AS TOTAL FROM ” + Dados.TABELA, null);

        if (cursor.getCount() > 0) {
        cursor.moveToFirst();

        if (cursor.getInt(0) > 0)

        //Coloque aqui o seu código
        Log.i(“–> “, “verificaDB”);
        }

        }//fecha o método

        }//fecha classe

        E para chamar ele eu fiz assim.

        … (){
        BackUpRestore backUpRestore = new BackUpRestore();

        … (){
        //clique do botão chama ele
        backUpRestore.verificaDB();

        }//fecha o método

        }//fecha classe

        1. Olá Paulo consegui mas somente na Activity principal

          Só queria fazer isso em uma classe separada usando um método especifico para isto
          mas sempre tenho erro.
          vou continuar tentando e descobrir

          Muito obrigado mestre

          OBS: (usei os traços para forçar a indentação)
          ———————————————————————————————–

          Cursor cursor = conn.rawQuery(“SELECT COUNT(*) AS TOTAL FROM ” + Dados.TABELA, null);

          if (cursor.getCount() > 0) {
          ————-cursor.moveToFirst();

          ————-if (cursor.getInt(0) > 0) {
          Log.d(“”, “#### A tabela contém dados ####”);

          ————- } else {
          —————–Log.d(“”, “#### A tabela não contém dados ####”);

          ————-}//fecha else
          ———-}//fecha if 1

          1. Onde é como você está criando é chamando essa consulta? Você está utilizando o método getWritableDatabase() ou getReadableDatabase() para criar a conexão com o banco de dados?

  5. Olá Paulo tudo bem,
    Eu consegui criar o método para verificar se a tabela contém dados antes de criar o backup,
    eu revi sua aula de banco de dados e usei o getWritableDatabase().

    Prof. eu estava lendo sobre “DatabaseUtils” dai fui testar e da pra fazer sem o Cursor a partir da API 11.

    —————————————
    long rawNum= DatabaseUtils.queryNumEntries(db, “DADOS”);

    if(rawNum== 0) {
    // Sem dados na tabela
    } else {
    // Tabela com dados
    }
    —————————————

    Mas Paulo, existe alguma vantagem ou desvantagem em usar o DatabaseUtils,
    ou é preferível usar o Cursor?

    Mais uma vez obrigado por compartilhar seus conhecimentos, abrazz fique com Deus

    1. Não há nenhuma desvantagem a classe DatabaseUtils apenas é uma classe utilitária para trabalhar com banco de dados e a classe Cursor

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: