1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

duvida em uma select com inner join

estou tentando fazer um inner join entre duas tabelas Empresa e Alteração, tenho uma main com quatro botoes, dois botoes de cadastrar e pesquisar empresa, e depois botoes de cadastrar e pesquisar alteração, quando clico para cadastrar um alteração abre um list view com todas as empresas cadastradas no sistema, quando clico em uma dessas empresas na list view abre uma outra tela para fazer o cadastro da alteração naquela empresa selecionada, quando eu clico na empresa o sistema pega o código da empresa e ao clicar no botão cadastrar alteração o sistema pega esse id da empresa e grava na coluna _ide da tabela alteração.

O meu problema é quando vou pesquisar essas alterações para determinada empresa, eu clicaria em Pesquisar alteração, abriria uma listview com as empresas cadastradas, ao selecionar uma das empresas abriria outra tela com outra listview com todas as alterações cadastradas para aquela empresa selecionada

Vamos aos códigos:

Classe Banco de dados:

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

public class BancoEmpresa extends SQLiteOpenHelper {

    //Tabela Empresa

    private static final String NOME_BANCO = "RealSysten.db";
    private static final String EMP_TABELA = "Empresa";
    private static final String EMP_ID = "_id";
    private static final String EMP_NOME = "nome";
    private static final String EMP_CNPJ = "cnpj";
    private static final int EMP_VERSAO = 1;

    public static String getEmpTabela() {
        return EMP_TABELA;
    }

    public static String getEmpNome() {
        return EMP_NOME;
    }

    public static String getEmpCnpj() {
        return EMP_CNPJ;
    }

    public static int getEmpVersao() {
        return EMP_VERSAO;
    }

    public static String getEmpId() {
        return EMP_ID;
    }

    public static String getNomeBanco() {
        return NOME_BANCO;
    }

    public BancoEmpresa(Context context){
        super(context, NOME_BANCO, null, EMP_VERSAO);
    }

    // Tabela alteração

    private static final String ALT_TABELA = "alteracao";
    private static final String ALT_ID = "_ida";
    private static final String AEMP_ID = "_ide";
    private static final String ALT_DESC = "descricao";
    private static final String ALT_PROG = "programador";
    private static final String ALT_STATUS = "status";


    public static String getAltTabela() {
        return ALT_TABELA;
    }

    public static String getAltId() {
        return ALT_ID;
    }

    public static String getAEmpId() {
        return AEMP_ID;
    }

    public static String getAltDesc() {
        return ALT_DESC;
    }

    public static String getAltProg() {
        return ALT_PROG;
    }

    public static String getAltStatus() {
        return ALT_STATUS;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql1 = "CREATE TABLE " + EMP_TABELA + "("
                + EMP_ID + " integer primary key autoincrement, "
                + EMP_NOME + " text(60), "
                + EMP_CNPJ + " text(20)"
                +")";
        db.execSQL(sql1);

        String sql2 = "CREATE TABLE " + ALT_TABELA + " ("
                + ALT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + ALT_DESC + " text(1000), "
                + ALT_PROG + " text(60), "
                + ALT_STATUS + " text(1), "
                + AEMP_ID + " text "
                + ")";
        db.execSQL(sql2);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS" + EMP_TABELA);
        db.execSQL("DROP TABLE IF EXISTS" + ALT_TABELA);
        onCreate(db);
    }
}

Classe AlteracaoController:

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

public class AltController {

    private SQLiteDatabase db;
    private BancoEmpresa banco;
    private final String select = "SELECT * FROM alteracao alt INNER JOIN empresa emp ON " +
            "alt._ide = emp._id WHERE alt._ide = ?";

    public AltController(Context context){
        banco = new BancoEmpresa(context);
    }

    public String inserAlt(String ide, String descricao, String programador, String status){
        ContentValues valores;
        long resultado;

        db = banco.getWritableDatabase();
        valores = new ContentValues();
        valores.put(BancoEmpresa.getAEmpId(), ide);
        valores.put(BancoEmpresa.getAltDesc(), descricao);
        valores.put(BancoEmpresa.getAltProg(), programador);
        valores.put(BancoEmpresa.getAltStatus(), status);

        resultado = db.insert(BancoEmpresa.getAltTabela(), null, valores);
        db.close();

        if(resultado == -1){
            return "Erro ao inserir registro";
        }else{
            return "Registro inserido com sucesso";
        }
    }

    public Cursor carregaAlt(){
        Cursor cursor;
        String[] campos = {banco.getAEmpId(), banco.getAltDesc(), banco.getAltProg(), banco.getAltStatus()};
        db = banco.getReadableDatabase();
        cursor = db.rawQuery(select, campos);

        if (cursor != null){
            cursor.moveToFirst();
        }
        db.close();
        return cursor;
    }
}

classe ListaAlteracao:

import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class ListaAlteracao extends AppCompatActivity {
    private ListView lista;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_alteracao);

        AltController crud = new AltController(getBaseContext());
        Cursor cursor = crud.carregaAlt();

        String[] nomeCampos = new String[]{
                BancoEmpresa.getAltProg(), BancoEmpresa.getAltDesc(), BancoEmpresa.getAltStatus()
        };

        int [] idViews = new int[] {
                R.id.AltProg, R.id.AltDescri, R.id.AltStatus
        };

        android.widget.SimpleCursorAdapter ad = new android.widget.SimpleCursorAdapter(getBaseContext(),
                R.layout.lista_alteracao, cursor, nomeCampos, idViews, 0);

        lista = (ListView) findViewById(R.id.lstAlteracao);
        lista.setAdapter(ad);
    }
}

O meu problema é o seguinte, quando clico no botão pesquisar alteração ele abre a listview com todas as empresas cadastradas, mas quando clico na empresa para abrir a tela com a listview das alterações da o seguinte erro no emulador de celular: Unfortunately, APP has Stopped.

E no log do android studio da o seguinte erro:

04-11 12:57:43.062 27703-27703/br.com.realsysten.realsystenapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 java.lang.IllegalArgumentException: column '_ide' does not exist
                                                                                     at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:301)
                                                                                     at br.com.realsysten.realsystenapp.ListaEmpresa$4.onItemClick(ListaEmpresa.java:70)
                                                                                     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
                                                                                     at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
                                                                                     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
                                                                                     at android.widget.AbsListView$1.run(AbsListView.java:3168)
                                                                                     at android.os.Handler.handleCallback(Handler.java:605)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                     at android.os.Looper.loop(Looper.java:137)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:4340)
                                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:511)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
                                                                                     at dalvik.system.NativeStart.main(Native Method)

bom...

pensei que estava criando a tabela com colunas erradas por causa do erro

column '_ide' does not exist

mas eu puxei o banco do emulador para o pc e abri no SQLite expert e a coluna estava la na tabela alteracao:

https://www.filepicker.io/api/file/X5dTMYRY2KHsu1zOhPQA

então imagino que seja um erro na minha select

private final String select = "SELECT * FROM alteracao alt INNER JOIN empresa emp ON " +
            "alt._ide = emp._id WHERE alt._ide = ?";

mas onde?

alguem pode me ajudar?

e por algum motivo o Status esta ficando Null em vez de receber a informação condida no status

String statusString = status;
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags android java sql ou faça a sua própria pergunta.