Select values from another table with more than one row in Websql

Asked

Viewed 43 times

0

I’m using Ionic + Ordova + Websql. I have basically these tables, partners and partiesEnderecos. In the address table can contain more than one row for each partner. How do I return these values?

I create the tables like this:

databaseValues.setup();
  databaseValues.bancoDeDados.transaction(function(transacao) {
  transacao.executeSql('CREATE TABLE IF NOT EXISTS parceiroEnderecos (' +
    'parceiro_id INTEGER,' +
    'logradouro VARCHAR(200),' +
    'numero VARCHAR(10),' +
    'UNIQUE(parceiro_id, logradouro) ON CONFLICT IGNORE);', []
  );

  transacao.executeSql('CREATE TABLE IF NOT EXISTS parceiros (' +
    'id INTEGER NOT NULL PRIMARY KEY,' +
    'nome_fantasia VARCHAR(300),' +
    'UNIQUE(id, nome_fantasia) ON CONFLICT IGNORE);', []
  );
});

In the ParceirosController I’m trying to do so:

databaseValues.setup();
databaseValues.bancoDeDados.transaction(function(transacao) {
  transacao.executeSql('select * from parceiros', [], function(transacao, parceiros) {
    for (parceiro of parceiros.rows) {
      _enderecos = getParceiroEnderecos(parceiro.id);
      _parceiro = {
        id: parceiro.id,
        nome_fantasia: parceiro.nome_fantasia,
        avatar: parceiro.avatar,
        beneficio_qtd: parceiro.beneficio_qtd,
        beneficio_maior: parceiro.beneficio_maior,
        enderecos: _enderecos
      }
      $scope.parceiros.push(_parceiro);
    }
  });
});

getParceiroEnderecos = function(parceiro_id) {
  _enderecos = [];
  databaseValues.setup();
  databaseValues.bancoDeDados.transaction(function(transacao) {
    transacao.executeSql('select * from parceiroEnderecos where parceiro_id = ?;', [parceiro_id], function(transacao, enderecos) {
      _enderecos = [];

      for (endereco of enderecos.rows) {
        _endereco = {
          logradouro: endereco.logradouro,
          numero: endereco.numero
        }
        _enderecos.push(_endereco);
      }
    });
    return _enderecos;
  })
}

Only that as the transacao should be asynchronous, I can’t add the address inside the partner, something like that:

parceiros = [
  {
    id: 1,
    nome_fantasia: 'empresa 1',
    enderecos: [
      {
        logradouro: 'Rua 1',
        numero: '123'
      },
      {
        logradouro: 'Rua 2',
        numero: '987'
      }
    ]
  }
]
  • Was any of the answer helpful? Don’t forget to choose one and mark it so it can be used if someone has a similar question!

1 answer

0

You must work with promises asynchronously as follows:

databaseValues.setup();
databaseValues.bancoDeDados.transaction(function(transacao) {
  transacao.executeSql('select * from parceiros', [], function(transacao, parceiros) {
    for (parceiro of parceiros.rows) {
      getParceiroEnderecos(parceiro.id).then(function(_enderecos) {
        _parceiro = {
          id: parceiro.id,
          nome_fantasia: parceiro.nome_fantasia,
          avatar: parceiro.avatar,
          beneficio_qtd: parceiro.beneficio_qtd,
          beneficio_maior: parceiro.beneficio_maior,
          enderecos: _enderecos
        }

        $scope.parceiros.push(_parceiro);
      })
    }
  });
});

getParceiroEnderecos = function(parceiro_id) {
  var promessa = $q.defer();

  _enderecos = [];
  databaseValues.setup();
  databaseValues.bancoDeDados.transaction(function(transacao) {
    transacao.executeSql('select * from parceiroEnderecos where parceiro_id = ?;', [parceiro_id], function(transacao, enderecos) {
      _enderecos = [];

      for (endereco of enderecos.rows) {
        _endereco = {
          logradouro: endereco.logradouro,
          numero: endereco.numero
        }
        _enderecos.push(_endereco);
      }
    });

    promessa.resolve(_enderecos);
  });

  return promessa.promise;
}

In this case use the library $q to generate the promise to be solved in the function getParceiroEnderecos.

  • https://codepaste.net/xbphfd In the first console.log only one id is displayed, in the second console.log everyone has the same id

Browser other questions tagged

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