Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Usando parametro na hora de fazer List<>

Boa tarde, tenho a seguinte dúvida:

Estou fazendo uma ligação de tabela e gostaria de saber como passo o parametro para que minha lista leia de acordo com que mostre as unidades pertencente àquela empresa.

Segue o código:

public List<Unidade> buscaUnidades() {
        List<Unidade> unidades = new ArrayList<>();

        Cursor c = dao.getReadableDatabase().rawQuery("SELECT * FROM Unidades, Empresas WHERE idEmpresa=empresa_id AND idEmpresa='?'", null);

        while (c.moveToNext())
            unidades.add(criaUnidade(c));
        c.close();
        return unidades;
    }
6 respostas

Olá Rafaela,

Qual erro está acontecendo quando o código é executado?

Já para ajudar na resolução, vou pedir para você postar aqui também o código das classes Unidade, Empresa e também do método criaUnidade.

Ele não dá erro algum, apenas não me traz as unidades... =[

public class Empresa implements Serializable {
    private Long id;
    private String nome;
    private String segmento;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSegmento() {
        return segmento;
    }

    public void setSegmento(String segmento) {
        this.segmento = segmento;
    }

    @Override
    public String toString() {return getId()+" - "+getNome();}
}
public class Unidade implements Serializable {

    private Long id;
    private Long idEmpresa;
    private String nome;
    private String cidade;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public Long getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(Long idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

    @Override
    public String toString() {
        return getNome() + " - " + getCidade();
    }
}
private Unidade criaUnidade(Cursor c){
        Unidade u = new Unidade();
        u.setId(c.getLong(c.getColumnIndex(ID)));
        u.setNome(c.getString(c.getColumnIndex(NOME)));
        u.setCidade(c.getString(c.getColumnIndex(CIDADE)));
        u.setIdEmpresa(c.getLong(c.getColumnIndex(ID_EMPRESA)));

        return u;
    }

Olá Rafaela,

Acho que então o problema pode estar na query que está sendo executada para trazer os dados. Vamos tentar a seguinte instrução:

SELECT * FROM Unidades JOIN Empresas ON idEmpresa = empresa_id WHERE idEmpresa = ?

Lembrando que você vai precisar passar o id da empresa cujas unidades você está querendo listar. Isso significa que o código do rawQuery tem que ficar mais ou menos assim:

Integer id = 1; // aqui vc coloca o id da empresa cujas unidades vc vai buscar, poderia ser um parâmetro do seu método também

Cursor c = dao.getReadableDatabase().rawQuery("SELECT * FROM Unidades JOIN Empresas ON idEmpresa = empresa_id WHERE idEmpresa = ?", new String[]{id.toString()});

Testa assim e vê se ajuda!

Então... eu tentei, mas continua não dando. Não sei o que estou fazendo errado.

public List<Unidade> buscaUnidades(Long idEmp) {
        List<Unidade> unidades = new ArrayList<>();
        Cursor c = dao.getReadableDatabase().rawQuery("SELECT * FROM Unidades JOIN Empresas ON idEmpresa = empresa_id WHERE idEmpresa = '?'", new String[]{idEmp.toString()} );

        while (c.moveToNext())
            unidades.add(criaUnidade(c));

        c.close();
        return unidades;
    }

E para chamar a lista de unidade:

 private void carregaListaDeUnidades() {
        UnidadeDAO dao = new UnidadeDAO(this);

        Long idEmp = empresa.getId();

        List<Unidade> unidades = dao.buscaUnidades(idEmp);
                dao.close();
                ArrayAdapter<Unidade> adapter = new ArrayAdapter<Unidade>(this, android.R.layout.simple_list_item_1, unidades);
                listaUnidades = findViewById(R.id.lista_unidades);
                listaUnidades.setAdapter(adapter);
    }

O erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.hlnengenharia.app, PID: 28568
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.hlnengenharia.app/br.com.hlnengenharia.app.listas.ListaUnidadesActivity}: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2572)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5728)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
                   Caused by: java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.
                      at android.database.sqlite.SQLiteProgram.bind(SQLiteProgram.java:212)
                      at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:166)
                      at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
                      at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
                      at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1346)
                      at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1285)
                      at br.com.hlnengenharia.app.dao.UnidadeDAO.buscaUnidades(UnidadeDAO.java:54)
                      at br.com.hlnengenharia.app.listas.ListaUnidadesActivity.carregaListaDeUnidades(ListaUnidadesActivity.java:81)
                      at br.com.hlnengenharia.app.listas.ListaUnidadesActivity.onCreate(ListaUnidadesActivity.java:42)
                      at android.app.Activity.performCreate(Activity.java:6301)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2519)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2654) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1488) 
                      at android.os.Handler.dispatchMessage(Handler.java:111) 
                      at android.os.Looper.loop(Looper.java:207) 
                      at android.app.ActivityThread.main(ActivityThread.java:5728) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
solução!

Olá Rafaela,

Tenta tirar as aspas simples que estão ao redor do ponto de interrogação na sua query. Esse erro que você postou costuma acontecer quando a gente coloca essas aspas nos parâmetros das queries. A linha ficaria assim:

        Cursor c = dao.getReadableDatabase().rawQuery("SELECT * FROM Unidades JOIN Empresas ON idEmpresa = empresa_id WHERE idEmpresa = ?", new String[]{idEmp.toString()} );

Isso deve fazer pelo menos o erro desaparecer mas aí precisamos ver se o vamos obter o resultado que você está buscando. Depois de fazer o teste, avisa pra gente se deu certo.

Funcionou!!!!!!!!!!!!!! Muito obrigada, Jeferson!!!!!!!!!