MySQL Dynamisch Suchen Select

TheR

Mitglied
Deutschland ist im Viertelfinale und ich hoffe jemand kann mir helfen.

Ich habe eine Tabelle und möchte diese anhand von IDs durchsuchen. Dazu habe ich ein JTextField mit einem DocumentListener versehen, das Ganze sieht im Moment so aus:

Java:
JTextField id = new JTextField();
id.getDocument().addDocumentListener(new DBSearch(this));

Java:
public class DBSearch implements DocumentListener {
	private SwingWorker<String, Void> worker;
	private JPanel panel;
	private String query;
	final String queryPraefix = "SELECT * FROM `Data` WHERE `ID` LIKE '";
	
	public DBSearch(JPanel panel) {
		this.panel = panel;
	}
	
	@Override
	public void insertUpdate(DocumentEvent e) {
		search(panel.getID());
	}
	
	@Override
	public void removeUpdate(DocumentEvent e) {
		search(panel.getID());
	}
	
	@Override
	public void changedUpdate(DocumentEvent e) {
		search(panel.getID());
	}
	
	private void search(String input) {
		if (worker != null) worker.cancel(true);
		
		if (!input.isEmpty()) input = input + "%";
		
		query = queryPraefix +  input+ "';";
		worker = new SwingWorker<String, Void>(){
			
			@Override
			protected String doInBackground(){
				ResultSet rs = DBConnector.getInstance().getQueryResult(query);
				int i = 0;
				try {
					while (rs.next() ) {
						i++; // hier lass ich mir alle passenden IDs ausgeben					
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
				return "";
			}
		};
		worker.execute();
	}
}

Bei dieser Variante funktioniert der Abbruch nich. Was ich möchte ist: Das der aktuelle Task unterbrochen wird, wenn man eine weitere Zahl in das Textfeld schreibt und mit der neuen (aktuellen) ID eine neue Suche beginnt.

MfG TheR
 
Zuletzt bearbeitet:
also kA ob es dir wirklich hilft...

a) wenn ich an meine DB connection ein close() schicke, wird die aktuelle Abfrage unterbrochen (sodenn sie noch läuft, siehe b)
b) wie Groß ist denn deine Tabelle? Bei mir ist die Abfrage schneller fertig, als ein zweiter "Buchstabe" eingetippt wird, ein Abbruch ist somit nicht nötig
c) du könntest auch einen KeyListener (drücken von Enter) dem TextField übergeben, oder einen Suchen-Button implementieren, wenn der Benutzer weiss wonach er etwa sucht, ist es denke ich besser als die Datenbank bei jedem Buchstaben zu nerven
 
Vielen Dank für die Antwort ich habe jetzt eine passende Lösung für mein Problem gefunden.

Da meine ID die Form S<inkrementierteZahl>E<VorkommenDerInkrementiertenZahl> hat, prüfe ich einfach auf die Eingabe eines "e" mit:

Java:
if (Pattern.compile(Pattern.quote("e"), Pattern.CASE_INSENSITIVE).matcher(id).find()) {

Das gibt mir die nötige Geschwindigkeit. Außerdem, und da muss ich dir zustimmen, nerve ich so nicht bei jedem getippten Zeichen die DB.

MfG TheR
 
Wäre ein Keylistener nicht nen Tick besser als dieses Pattern-Monstrum?

Java:
if (evt.getKeyCode() == KeyEvent.VK_E) {
     //code ...
}
 
Und da die Usereingabe ungefiltert im SQL landet solltest du lieber PreparedStatements implementieren...
 

Neue Themen


Zurück
Oben