Лучший способ для заполнения JTable данными из SQLite4java - PullRequest
0 голосов
/ 20 марта 2012

Я использую sqlite4java и хочу отобразить результаты запроса в компоненте Table.Я сделал DataModel, и он работает, получая каждое значение вызова, как показано в моем коде ниже, но это действительно медленно, когда результат запроса имеет 10 или более строк и 10 столбцов.

public Object getValueAt(final int row,final int column) {
   return queue.execute(new SQLiteJob<Object>() {
        @Override
        protected Object job(SQLiteConnection connection) throws SQLiteException {
            Object Result = "";
            SQLiteStatement st = connection.prepare("SELECT * from test LIMIT ?,1 ;");
            st.bind(1, row);
            while (st.step()) {
                Result = st.columnString(column);
            }
            st.dispose();
            return Result;
        }
    }).complete();


}

Что является правильнымспособ заставить это работать как можно быстрее?

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

В настоящее время вы будете выполнять запрос каждый раз, когда вызывается метод getValueAt (который вызывается много). Обычно запрос к базе данных недостаточно быстр для использования в этом методе (конечно, не при использовании удаленной базы данных).

Лучше всего один раз запросить базу данных (ну, это немного зависит от размера данных, которые вы извлекаете из вашей БД), поместить ее в TableModel и построить свою таблицу, используя эту TableModel.

В SO содержится много вопросов и ответов на эту проблему, поэтому быстрый поиск покажет вам множество примеров кода. Я скопировал эту ссылку с одного из этих вопросов. Все кредиты за код на этой странице идут, конечно, автору (который также присутствует здесь, но я забыл его имя пользователя на SO)

2 голосов
/ 20 марта 2012

Я никогда не касался SqLite, может быть, я не согласен с тем, что Встроенные базы данных могут быть слишком ленивыми

  1. (для жесткого, самого жесткого SQL-запроса) create JTable с DefaultTableModel , данные для заполнения JTable перемещаются в BackGroung Tasks с использованием SwingWorker или Runnable#Thread (в этом случае вывод в DefaultTableModel должен быть перенесенв invokeLater), там можно использовать разбиение на страницы, разделив один SQL-запрос (... LIMIT int, int) на несколько отдельных запросов и с отдельным выводом в JTable

  2. для стандартного запроса, который выможно использовать подготовленные классы, основанные на AbstractTableModel (избегая изобретать велосипед), поиск по ResultSetTableModel или лучший способ будет Таблица из базы данных по @camickr

...