У меня проблемы с созданием базы данных SQLite с использованием текстового файла. Я должен создать список участников со следующим: (член) номер, имя, фамилия, адрес и номер телефона (если есть). Я использую методы для создания базы данных, но не могу заставить ее работать должным образом.
Текстовый файл заполняется следующим образом (предполагается, что «...» означает, что в списке есть другие):
1;John;Doe;Downing, Virginia;123456
2;Jane;Doe;Obispo 2, California;342532
...
...
14;Rich;Damons;Av.5, NY
...
...
Как вы, вероятно, видите, у некоторых членов нет номера телефона, что, я думаю, является причиной того, что база данных не заполняется. Причина, по которой я в это верю, заключается в том, что я пытался составить свой собственный список со всей информацией, и это, кажется, работает, но удаление телефонных номеров дает мне следующую ошибку Index 4 out of bounds for length 4
Это метод:
private static void createNewTable() throws Exception {
String url = "jdbc:sqlite:members.db";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
Scanner reader = new Scanner(new File("member_list.txt"));
String sql = "create table Member(No integer primary key, " +
"First varchar(50), " +
"Last varchar(50), " +
"Address varchar(50), " +
"Telephone integer);";
stmt.executeUpdate(sql);
try (reader) {
while (reader.hasNextLine()) {
String[] db = reader.nextLine().split("[;]");
String fName = db[1], lName = db[2], address = db[3];
int no = parseInt(db[0]), tel = parseInt(db[4]);
if (db.length == 5) {
sql = "insert into Member values(" + no + ",'" + fName + "','" + lName + "','" + address + "'," + tel + ");";
stmt.executeUpdate(sql);
} else {
sql = "insert into Member values(" + no + ",'" + fName + "','" + lName + "','" + address + "'," + null + ");";
stmt.executeUpdate(sql);
}
}
}
con.close();
out.println("Start: Creates table");
showMessageDialog(null, "Start: Creates table");
}
Любая помощь приветствуется!
Я попытался создать свой собственный список участников со всей информацией, и это сработало; Я попытался создать список участников без телефонных номеров, но это не сработало.
Не объединяйте строки для создания инструкции SQL. Что, если одного из людей зовут Robert'; drop table Member--
?
к вашему сведению split("[;]")
можно заменить на split(";")
.
@DavidConrad Спасибо за совет. Как я могу обойти это? Извините, но английский не мой родной язык.
Для записей, не содержащих номера телефона, длина строки равна 4. Следовательно, когда вы пытаетесь получить доступ к базе данных db[4], вы получаете исключение ArrayIndexOutofBound.
Инициализируйте переменную tel
внутри условия if.
Это точно сработало! Ценить это!
Результат вашего разделения (db
) будет иметь длину только 4 для участников без номера телефона, что означает, что его самый высокий индекс будет равен 3.
int no = parseInt(db[0]), tel = parseInt(db[4]);
пытается получить доступ к индексу, который находится за пределами для членов без номера телефона.
Подумайте о том, чтобы переместить объявление tel = parseInt(db[4])
внутрь оператора if, относящегося к участникам, у которых есть номер телефона, так как в любом случае это будет актуально только для этих случаев.
Спасибо за подробное объяснение! Теперь, когда вы это объяснили, это имеет смысл, но я застрял на этом надолго.
После того, как вы разделите строку, проверьте длину и действуйте соответственно.