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