Why is it taking so long to complete Data?

Asked

Viewed 64 times

0

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

The funniest thing is when I made the first appointments I was fast, after I started giving it, someone knows 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;
}

1 answer

1

Possible problem:

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

In a scenario you own 100 products and each product has 10 balances you will make 1000*(100*10)* requests at the bank(I hope you agree with me that it is unnecessary to fetch 1000 things at the bank). And the more products and balances you have, the slower it will take to finish this 'journey'.

Solution:

I particularly prefer the second option.

  1. Try to bring all products already with all balances at once.
  2. Look for the products and as long as you need to look at the balance, you search at the bank. I’m sure in 100 products you won’t want to know the balance of all 100.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.