Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

17
respostas

Minha aplicação não está fazendo inserção porque o id retorna null

package com.example.weverton.myproject.dao;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.example.weverton.myproject.model.Area;

import java.util.ArrayList;
import java.util.List;

public class AreaDAO extends SQLiteOpenHelper {
    public AreaDAO(Context context) {
        super(context, "AreaPi", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE Area(id INTEGER PRIMARY KEY, nome TEXT NOT NULL);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        String sql = "DROP TABLE IF EXISTS Area";
        db.execSQL(sql);
        onCreate(db);
    }

    public void insereArea(Area area) {
        SQLiteDatabase db = getWritableDatabase();

        ContentValues dados = new ContentValues();
        dados.put("nome",area.getNome());

        db.insert("Area",null, dados);
    }

    public List<Area> buscaArea() {
        String sql = "SELECT * FROM Area;";
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery(sql,null);

        List<Area> areas = new ArrayList<Area>();
        while (c.moveToNext()){
            Area area = new Area();
            area.setId(c.getLong(c.getColumnIndex("id")));
            area.setNome(c.getString(c.getColumnIndex("nome")));

            areas.add(area);
        }
        c.close();

        return areas;
    }
}
17 respostas

Oi Weverton, tudo bem ?

Cara não entendi seu problema. Aparentemente está certo.

Oi Weverton, tranquilo?

Tem como você postar seu log aqui por favor?

Galera o problema é o seguinte, eu criei o Dao para cadastrar uma Área de desenvolvimento, por exemplo, Web, Mobile e Desktop. E também criei uma tela para listar as áreas cadastradas, só que minha ListView não retornava nada, então no método setOnClickListener eu criei um Toast para ver o que meu formulário estava tentando salvar o Toast foi o seguinte "Toast.makeText(Contexto,"Salvo" + area.getId() + area.getNome()).show()" e ao clicar no botão salvar o Toast exibe "Salvo null Web" ou seja ele não está gerando um Id para minha área por isso não insere no banco.

Mas quando você declara como inteiro e primary key, ele faz o gerenciamento automatico.

Ele tá mostrando nulo porque você não o buscou ainda, depois que realizar a busca, seu objeto terá o id.

Mas não mostra na minha activity lista, eu pego a ListView e faço um setAdapter passando o meu adapter que recebe um ArrayAdapter de Area... E mesmo assim ao cadastrar não exibe nada, o problema pode estar no meu Adapter ??

Mostra o restante do código para gente por gentileza

Este é o código helper que utilizo para recuperar os dados digitados

package com.example.weverton.myproject.helper;

import android.widget.EditText;

import com.example.weverton.myproject.CadastroActivity;
import com.example.weverton.myproject.R;
import com.example.weverton.myproject.model.Area;

/**
 * Created by Weverton on 05/03/2018.
 */

public class AreaHelper {

    private final EditText campoNomeArea;

    public AreaHelper(CadastroActivity activity){
       campoNomeArea = (EditText) activity.findViewById(R.id.nome_area);
    }

    public Area pegaArea() {
        Area area = new Area();
        area.setNome(campoNomeArea.getText().toString());

        return area;
    }
}

E esta é a Activity que deveria mostrar os dados inseridos, em uma ListView

package com.example.weverton.myproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import com.example.weverton.myproject.dao.AreaDAO;
import com.example.weverton.myproject.model.Area;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        AreaDAO areaDao = new AreaDAO(this);
        List<Area> areas = areaDao.buscaArea();
        areaDao.close();

        ListView listaArea = (ListView) findViewById(R.id.listaArea);
        ArrayAdapter<Area> adapter = new ArrayAdapter<Area>(this,android.R.layout.simple_list_item_1,areas);
        listaArea.setAdapter(adapter);

    }
}

Mostra para gente seu formulário para termos uma ideia de como está sendo feito

Se possível também o logcat :)

Este é o layout do formulario

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.weverton.myproject.CadastroActivity">

    <EditText android:id="@+id/nome_area"
        android:hint="Nome da area"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText android:id="@+id/nome_linguagem"
        android:hint="Nome da linguagem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText android:id="@+id/desc_linguaguem"
        android:hint="Descrição da linguagem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button android:id="@+id/salvar"
        android:text="Salvar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

Esta é a Activity de do formulario

package com.example.weverton.myproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.weverton.myproject.dao.AreaDAO;
import com.example.weverton.myproject.helper.AreaHelper;
import com.example.weverton.myproject.model.Area;

public class CadastroActivity extends AppCompatActivity {

    private AreaHelper areaHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cadastro);

        areaHelper = new AreaHelper(this);


        Button botao = (Button) findViewById(R.id.salvar);
        botao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Area area = areaHelper.pegaArea();
                Linguagem ling = lingHelper.pegaLinguagem();

                // INSERE A AREA NO BANCO
                AreaDAO areaDao = new AreaDAO(CadastroActivity.this);
                areaDao.insereArea(area);
                areaDao.close();



                Toast.makeText(CadastroActivity.this,"Salvo" +area.getId()+area.getNome() ,Toast.LENGTH_SHORT).show();
                finish();
            }
        });
    }
}

Daniel Artini, ao clicar no botão "Salvar" o logcat apresenta isso

03-08 01:07:15.208 17039-17075/com.example.weverton.myproject D/EGL_emulation: eglMakeCurrent: 0xa3f6efa0: ver 2 0 (tinfo 0xa3f8a880)
03-08 01:07:15.209 17039-17075/com.example.weverton.myproject D/EGL_emulation: eglMakeCurrent: 0xa3f6efa0: ver 2 0 (tinfo 0xa3f8a880)
03-08 01:07:15.242 17039-17075/com.example.weverton.myproject D/EGL_emulation: eglMakeCurrent: 0xa3f6efa0: ver 2 0 (tinfo 0xa3f8a880)
03-08 01:07:15.416 17039-17075/com.example.weverton.myproject D/EGL_emulation: eglMakeCurrent: 0xa3f6efa0: ver 2 0 (tinfo 0xa3f8a880)
03-08 01:07:15.450 17039-17075/com.example.weverton.myproject D/EGL_emulation: eglMakeCurrent: 0xa3f6efa0: ver 2 0 (tinfo 0xa3f8a880)
03-08 01:07:15.451 17039-17075/com.example.weverton.myproject E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa3ef68c0
03-08 01:07:15.452 17039-17075/com.example.weverton.myproject D/OpenGLRenderer: endAllStagingAnimators on 0xa3fb4080 (RippleDrawable) with handle 0xa3ebf070
03-08 01:07:17.088 17039-17075/com.example.weverton.myproject E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa3ef7400

Weverton, seu código está certinho, você tentou abrir a aplicação depois ?

Sim, eu executei no emulador, faço o cadastro e salvo, mas ao executar a Activity que deveria mostrar os dados salvos não retorna nada, minha ListView permanece vazia. Estranho, será que pode estar acontecendo algo com a IDE ?

Na verdade, eu digo para você sair da app e entrar de novo, acho que está faltando essa etapa, dado que a busca está sendo feita no oncreate, e como voce retornou para a activity não há necessidade de cria-la novamente.

Corrigimos isso mais para frente no curso, colocando no onresume

Tudo bem, irei procurar a solução, talvez eu esteja errando no ciclo de vida... Obrigado pela ajuda