Как я могу создать базу данных из файла с помощью Java?

У меня проблемы с созданием базы данных 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");
    }

Любая помощь приветствуется!

Я попытался создать свой собственный список участников со всей информацией, и это сработало; Я попытался создать список участников без телефонных номеров, но это не сработало.

После того, как вы разделите строку, проверьте длину и действуйте соответственно.

David Conrad 05.04.2022 16:35

Не объединяйте строки для создания инструкции SQL. Что, если одного из людей зовут Robert'; drop table Member--?

David Conrad 05.04.2022 16:37

к вашему сведению split("[;]") можно заменить на split(";").

Bohemian 05.04.2022 16:48

@DavidConrad Спасибо за совет. Как я могу обойти это? Извините, но английский не мой родной язык.

Adler 05.04.2022 17:16

Используйте PreparedStatement.

David Conrad 06.04.2022 22:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для записей, не содержащих номера телефона, длина строки равна 4. Следовательно, когда вы пытаетесь получить доступ к базе данных db[4], вы получаете исключение ArrayIndexOutofBound.

Инициализируйте переменную tel внутри условия if.

Это точно сработало! Ценить это!

Adler 05.04.2022 16:52

Результат вашего разделения (db) будет иметь длину только 4 для участников без номера телефона, что означает, что его самый высокий индекс будет равен 3.

int no = parseInt(db[0]), tel = parseInt(db[4]);

пытается получить доступ к индексу, который находится за пределами для членов без номера телефона. Подумайте о том, чтобы переместить объявление tel = parseInt(db[4]) внутрь оператора if, относящегося к участникам, у которых есть номер телефона, так как в любом случае это будет актуально только для этих случаев.

Спасибо за подробное объяснение! Теперь, когда вы это объяснили, это имеет смысл, но я застрял на этом надолго.

Adler 05.04.2022 16:59

Другие вопросы по теме