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

0

I'm using Ionic + Cordova + WebSql. I have basically these tables, partners and partnerEnderecos. 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);', []
  );
});

No ParceirosController I'm trying to do this:

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;
  })
}

But since transacao must be asynchronous, I can not add the address inside the partner, something like this:

parceiros = [
  {
    id: 1,
    nome_fantasia: 'empresa 1',
    enderecos: [
      {
        logradouro: 'Rua 1',
        numero: '123'
      },
      {
        logradouro: 'Rua 2',
        numero: '987'
      }
    ]
  }
]
    
asked by anonymous 22.09.2017 / 17:38

1 answer

0

You should 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 resolved in function getParceiroEnderecos .

    
22.09.2017 / 18:45