[ajuda][iniciante][fazer um id]

22 respostas Resolvido
netbeansjava
B

Quero fazer um id sequêncial que compara com o que já foi salvo no banco de dados para não repetir.
Estou usando ficheiro txt como banco de dados.
Para contornar esse problema usei o método Random.
Mas que quero algo sequêncial, já pesquisei bastante e nada do que eu encontrei me deu uma ideia exata do que eu queria, alguém poderia me ajudar?

Edit: Está é o projecto que estou trabalhando, o id(prontuário) é quero que seja sequencial(por exemplo, 1, 2, 3, 4) caso eu apagar um id ele não repetir.

22 Respostas

J

Para utilizar sequencial utilizando um txt como base de dados, você precisa sempre recuperar o último id savo e incrementá-lo.
Para usar um identificador sem se preocupar com isso poderia usar um UUID.

W

Estou considerando que vc está salvando seus dados assim, com o id sendo o primeiro dado:

1,aaa
2,bbb
3,ccc

Para pegar o último id, vc poderia fazer assim:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Comparator;
import java.util.stream.Stream;

public class Main {
  public static void main(String... args) {
    saveName("aaa");
    saveName("bbb");
    saveName("ccc");
  }

  private static void saveName(String name) {
    try {
      long lastId = getLastId() + 1;

      String data = lastId + "," + name + "\n";

      Files.write(Paths.get("database.txt"), data.getBytes(), StandardOpenOption.APPEND);
    } catch (IOException e) {
      System.out.printf("Erro: %s não foi salvo!%n", name);
    }
  }

  private static long getLastId() {
    try (Stream<String> lines = Files.lines(Paths.get("database.txt"))) {
      return lines
          .map(line -> Long.valueOf(line.split(",")[0].trim()))
          .max(Comparator.naturalOrder())
          .orElse(0L);
    } catch (IOException e) {
      return 0;
    }
  }
}
B

Anotação 2022-04-04 090110

[Não consegui implementar o código acima num projeto como este]

B

O que estou fazendo para tentar dar solução ao problema.

B

Tem como mostrar isso?
Postei o que estou tentando fazer.

H

Se é pra ser sequencial, por que não usa o próprio banco de dados pra isso?

Todo banco possui suporte a SEQUENCE, basta pesquisar como fazer para o que vc está usando.

Uma SEQUENCE já garante unicidade (não vai repetir, mesmo se dois ou mais usuários tentarem inserir ao mesmo tempo - esse tipo de controle é bem mais complicado de fazer na camada da aplicação, deixe que o banco cuide disso). E como o nome já diz, também garante que será sequencial.

Não reivente a roda :slight_smile:

B

Poderias fazer um exemplo de como seria,
Material para banco de dados txt é difícil de achar,
Não sabia sobre isso por isso tô tentando reinventar

H

Ah, agora que eu vi que vc está usando um TXT…

Então use o que já foi sugerido :slight_smile:

B

Tentei fazer a implementação, mas não deu certo.
Por isso partilhei a foto com detalhes do que quero fazer…

J

Com UUID seria algo assim:

String id = UUID.randomUUID().toString();

Se for utilizar sequencial pode seguir o exemplo que o @wldomiciano já postou mais acima.

W

Vc pode mostrar o código da parte que salva os dados no TXT e um exemplo do TXT gerado? Na hora de postar código, evita usar prints, melhor usar o bloco de códigos que o proprio forum disponibiliza.

B

Vou já postar aqui…

B
private void cadastrarActionPerformed(java.awt.event.ActionEvent evt) {

Data d = new Data();

data.setText(d.getDataString());
if (nome.getText().equals("")) {
        JOptionPane.showMessageDialog(this, "Preencher o campo nome.");
    } else if (endereco.getText().equals("")) {
        JOptionPane.showMessageDialog(this, "Preencher o campo endereço.");
    } else if (contacto.getText().equals("")) {
        JOptionPane.showMessageDialog(this, "Preencher o campo contacto.");
    } else {
        try {

            BufferedWriter conexao;
            Paciente p = new Paciente(iden.getText(), nome.getText(), idade.getText(), endereco.getText(), contacto.getText(), peso.getText(), temperatura.getText(), risco.getSelectedItem().toString(), seccao.getSelectedItem().toString(), data.getText());

            conexao = new BufferedWriter(new FileWriter("paciente_consulta.txt", true));

	PacienteConexao control = new PacienteConexao();
            control.banco(conexao, p);
            conexao.close();
            JOptionPane.showMessageDialog(this, "Cadastrado com sucesso.");
            loadTable();

            clean();
            gerarId();

        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, e.getMessage());
        }
    }
}
B
public class PacienteConexao {

public void banco(BufferedWriter bw, Paciente p) {

try {

bw.write(p.getId() + ;);

bw.write(p.getNome() + ;);

bw.write(p.getIdade() + ;);

bw.write(p.getEndereco() + ;);

bw.write(p.getContacto() + ;);

bw.write(p.getPeso() + ;);

bw.write(p.getTemperatura() + ;);

bw.write(p.getRisco() + ;);

bw.write(p.getSeccao() + ;);

bw.write(p.getData() + ;\n);
} catch (IOException e) {
        e.getMessage();
    }
}

}

B

9424;Moniz António;19;Luanda;923 458 764;55,9;28,7;Azul;Pediatria;04/04/2022;

W

Experimentar fazer uma modificação no método gerarId(). Altera para ficar assim:

Veja que mudei um pouquinho o código que mostrei na minha primeira resposta. Eu adaptei para a sua necessidade.

private void GerarActionPerformed() {
  gerarId();
}

public void gerarId() {
  iden.setText(String.valueOf(getLastId()));
}

private long getLastId() {
  try (Stream<String> lines = Files.lines(Paths.get("paciente_consulta.txt"))) {
    return lines
        .map(line -> Long.valueOf(line.split(";")[0].trim()))
        .max(Comparator.naturalOrder())
        .orElse(0L);
  } catch (IOException e) {
    return 0;
  }
}
B

E como faço para incrementar?

No método gerarId tentei usar:

long lastId = getLastId() + 1;

Mas não muda o valor

B
private void GerarActionPerformed() {

gerarId();

}
public void gerarId() {

iden.setText(String.valueOf(getLastId()));

long lastId = getLastId() + 1;

// Usei o comando de saída para ver o que acontece

//e nada desejado, imprimi 1 mas não seta no iden

}
private long getLastId() {

try (Stream lines = Files.lines(Paths.get(paciente_consulta.txt))) {

return lines

.map(line  Long.valueOf(line.split(";")[0].trim()))

.max(Comparator.naturalOrder())

.orElse(0L);

} catch (IOException e) {

return 0;

}

}
W

A ideia é que ele incremente sozinho.

Tenta debugar para ver se ele está conseguindo ler o arquivo corretamente, pode ser que ele não esteja encontrando seu TXT.

W
Solucao aceita

@BRoleg99 eu olhei melhor seu código. Aqui vc está incrementando só depois.

public void gerarId() {
  iden.setText(String.valueOf(getLastId()));
  long lastId = getLastId() + 1;
}

Experimenta trocar por isto:

public void gerarId() {
  iden.setText(String.valueOf(getLastId() + 1));
}
B

Valeu, ficou perfeito

B

Obrigado a todos :heart::heart:

Criado 3 de abril de 2022
Ultima resposta 6 de abr. de 2022
Respostas 22
Participantes 4