Why is it taking so long to fill in the Data?

0

I have the following problem, when searching the data in the base and filling my object to manipulate on the screen, it is taking a long time and leaking memory, I tried to optimize but could not.

The funniest is when I made the first queries I was quick, after I started giving this, does anyone know how to solve ??

 public List<ProdutoTO> buscarTodos() {
    // Produtos
    List<ProdutoTO> produtos = new ArrayList<>();

    // Pega o cursor com todos os dados
    Cursor cursor = findAll();

    // Pega o primeiro elemento
    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        Produto produto = readRow(cursor);
        List<SaldoEstoque> saldos = this.saldoEstoqueDAO.getSaldoEstoque(produto, UtilGlobal.usuario);
        ProdutoTO produtoTO;
        if (saldos == null && saldos.size() == 0) {
            produtoTO = new ProdutoTO(produto, saldos.get(0));
        } else {
            produtoTO = new ProdutoTO(produto, null);
        }
        produtos.add(produtoTO);
        cursor.moveToNext();
    }
    // Fecha o cursor
    cursor.close();

    // Retorna os dados
    return produtos;
}

private Produto readRow(Cursor cursor) {
    Produto produto = new Produto();
    try {
        // As colunas são recuperadas na ordem que foram selecionadas
        produto.setId(cursor.getLong(cursor.getColumnIndex("id")));
        produto.setCodigo(cursor.getString(cursor.getColumnIndex("codigo")));
        produto.setEan(cursor.getString(cursor.getColumnIndex("ean")));
        produto.setNome(cursor.getString(cursor.getColumnIndex("nome")));
        produto.setPreco(cursor.getFloat(cursor.getColumnIndex("preco")));
        produto.setPrecocusto(cursor.getFloat(cursor.getColumnIndex("precocusto")));
        produto.setPrecoultimacompra(cursor.getLong(cursor.getColumnIndex("precoultimacompra")));
        produto.setUnidademedida(this.unidadeMedidaDAO.getUnidade(cursor.getLong(cursor.getColumnIndex("idunidademedida"))));
        //produto.setGrupoProduto(this.grupoProdutoDAO.getGrupoProduto(cursor.getLong(cursor.getColumnIndex("idhierarquia"))));
        //produto.setFamilia(this.familiaDAO.getFamilia(cursor.getLong(cursor.getColumnIndex("idfamilia"))));
        produto.setInativo(cursor.getInt(cursor.getColumnIndex("inativo")));
    } catch (Exception e) {
    }
    return produto;
}
    
asked by anonymous 30.03.2017 / 20:03

1 answer

1

Possible problem:

What can be many requests in your database, you first make a list with all products (Cursor cursor = findAll ()) and then you loop and within this loop you search the balances of the product.

In a scenario where you have 100 products and each product has 10 balances you will do 1000 * (100 * 10) * requisitions in the bank (I hope you agree with me that it is unnecessary to look for 1000 things in the bank). And the more products and balances you have, the slower it will take to finish this 'course'.

Solution:

I particularly prefer the second option.

  • Try to bring all products already with all balances in one go.
  • Search the products and as you need to look at the balance, you search the bank. I'm sure that in 100 products you will not want to know the balance of all 100.
  • 30.03.2017 / 21:50