Member 13780097 Ответов: 1

Отображение строки в jtextarea каждый раз при вводе нового имени


Я хочу отображать строку в jtextarea каждый раз, когда вводится новое имя. Предположим, что пользователь пишет "Paul" в поле jtextfield, основанном на SQLite, он должен показать соответствующий ответ, который будет "Smith". У меня есть база данных с несколькими именами, и независимо от того, что я пишу, скажем "Питер", она показывает "Смит" там, где должна была показывать "Паркер". Я хочу, чтобы каждый раз, когда пользователь вводит имя, появлялась соответствующая фамилия.

Что я уже пробовал:

Я пробовал этот код, но появляется только первая строка из БД:
EDIT: это метод, который я использовал
public void fetch() throws Exception{	
	Connection con = null;
	con = sqliteConnection.sqliteConnector();
	PreparedStatement pst = null;
	ResultSet rs = null;
	try
	    {
		String quest=userInputField.getText().toLowerCase().trim().toString();
			String sql = "select * from user where name LIKE '% %'";
			pst = con.prepareStatement(sql);
			//pst.setString(1, quest);//getting array index out of bounds 0
			rs = pst.executeQuery();
			if(rs.next()){ 
				String ans = rs.getString("answer");
				textarea.append(ans +"\n");   
				
			}else {
            	  textarea.append("Nothing was found." +"\n");  
            }
			
			System.out.println("Succesfully retrieved data from bcsdb");
			if (pst != null) pst.close();
            System.out.println("PST was successfully closed!");
            if (rs != null) rs.close();
            System.out.println("PS was successfully closed!");
            if (con != null) con.close();
            System.out.println("Con was successfully closed!");
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}		
	}


Заранее спасибо!

1 Ответов

Рейтинг:
1

Richard MacCutchan

Ваш оператор SQL будет соответствовать всем именам. Вам нужно изменить его с помощью параметра, который указывает имя, введенное пользователем.


Member 13780097

Не могли бы вы показать мне, как это сделать? Я попробовал с pst.setString(1, variable_name), но у меня есть его ошибка: java.lang.ArrayIndexOutOfBoundsException: 0

Richard MacCutchan

Вам нужно показать код и объяснить, где происходит ошибка. Видеть Использование подготовленных операторов (учебники Java™ > JDBC(TM) Database Access > JDBC Basics)[^] для получения более подробной информации.

Member 13780097

У меня возникла ошибка в этой строке : pst.setString(1, userInputField.getText().toLowerCase().trim());

Richard MacCutchan

Я не вижу в этом утверждении ничего очевидного. Пожалуйста, отредактируйте свой вопрос и покажите больше кода.

Member 13780097

Я опубликовал полный метод, который использовал. Надеюсь, это поможет вам найти решение для меня

Richard MacCutchan

Ваш оператор SQL по-прежнему неверен, и вы не должны использовать LIKE, так как ищете запись с определенным именем. Это должно быть что-то вроде:
"select * from user where name = ?" Возможно, вам придется проверить документацию на предмет точного синтаксиса.

Member 13780097

Спасибо за ваш ответ. Я попробовал ваше решение, но оно, похоже, не работает. Все работает с SQlite, но он просто не может извлекать данные на основе пользовательского ввода. Я попробовал это сделать:
Строка sql = "выберите имя, фамилию пользователя, где верхний(имя) Как верхний('"+quest+"') || '%'"; - он берет только из первого ряда. Я не знаю, является ли это версией SQLite, которая вызывает проблему.

Richard MacCutchan

Почему вы все еще используете подобную фразу, когда она вам не нужна? Просто используйте предложенный мной образец с правильным значением имени в параметре (правильно прописанным), или:
"select * from user where name = \"" + quest + "\";"

Member 13780097

Когда я использую ваш образец, ничего не возвращается:
String sql = "select * from user where name = ' " +quest+ " '; ";//nothing is found Только подобное, кажется, работает. Я вот-вот сдамся! Вы думаете, это потому, что я использую SQLite?

Richard MacCutchan

Нет, скорее всего, это связано с тем, что вы не используете правильные значения для параметра name. Если имя в базе данных Норман, то передаваемое значение должно быть точно таким же, включая верхний регистр для начальной буквы и нижний регистр для остальных.

Вы можете проверить точное содержание, просто используя "SELECT * FROM user;".

Member 13780097

Я согласен с вами. Допустим, я использую "SELECT * FROM user;", а затем набираю "Paul", возвращается "Smith", что правильно. Но когда я набираю "Питер", снова возвращается "Смит", и SQLite, похоже, не знает, что он должен вернуть "Паркер". Я думаю, что использовал все возможности, чтобы помочь SQLite узнать, чего я хочу:


//String sql = "select * from user where name match ' ' ";//prints first row only
//String sql = "SELECT * FROM user WHERE name like ? ";//shows first row only
//String sql = "SELECT * FROM user WHERE LOWER(name) LIKE ?";
//String sql = "select * from user where name LIKE :name"; //show answer from first row only
String sql = "select * from user";//first row is returned
//String sql = "select * from user where name LIKE '"+quest+"' ";//showing first row only
//String sql = "select * from user where name = '%" + quest + "%' ";//nothing is retrieved from the db
//String sql = "select * from user where name=?";//not fetching any data
//String sql = "select * from user where name like 'a%'";
//String sql = "SELECT name, surname FROM user WHERE UPPER(name) LIKE UPPER('"+quest+"') || '%'";
//String sql = "select * from user where name like '%" + quest + "%'";//show from first row only

<code>

Richard MacCutchan

Похоже, что бы я ни предлагал (проверив это на своей системе), вы продолжаете делать все по-другому. И Вы, кажется, не понимаете, как на самом деле работает SQL. Когда вы входите "select * from user"; оно будет возвращайте каждую строку, но вам нужно обработать результаты, чтобы фактически отобразить их. Я предлагаю вам вернуться к документации Java и изучить, как обрабатывать результирующие наборы SQL.

Member 13780097

Спасибо Вам за ваше терпение и не сдавайтесь. Поверьте мне, я перепробовал все, что вы сказали, и даже прошел через документацию Java. Вы использовали SQLite, когда тестировали свою систему? Как бы я ни старался, эта часть, похоже, не работает. Можешь ли ты в конце концов показать мне все, что ты сделал? Может быть, это if(rs.next ()), который вызывает проблему, или я должен использовать createStatement вместо PreparedStatement. Большое спасибо!

Richard MacCutchan

Проработайте учебник, на который я дал вам ссылку, и посмотрите, как это сделать. Это то, что я сделал, и это работает правильно.