2012-03-19 2 views
0

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

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(); 


} 

Каков правильный способ заставить работу работать как можно быстрее?

+0

мой вопрос, если 'SQLite' были реализованы' Paginations', что означает ваш код '(SELECT .... LIMIT?, 1) ' – mKorbel

+0

Я не знаю, что вы подразумеваете под Paginations, но SELECT .. LIMIT x, y отлично работает. – user554033

+0

Это SQL-соединение является только одним направлением ???, только о заполнении данных от SQL-движка до JTable ???, или обновления в JTable могут быть немедленно сохранены в базе данных? – mKorbel

ответ

2

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

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

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

2

Я никогда не касался SQLITE, может быть, я dis_agree что Embedded databases может быть слишком ленив

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

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