使用SQLite4java中的数据填充JTable的最佳方法

时间:2012-03-19 22:01:04

标签: java swing sqlite jtable datamodel

我正在使用sqlite4java,我想在Table组件中显示查询结果。 我已经创建了一个DataModel,它的工作方式是获取每个调用值,如下面的代码所示,但是当查询结果有10k或更多行和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 个答案:

答案 0 :(得分:2)

我从未接触过SqLite,也许我不同意Embedded databases可能太懒惰

  1. (对于最难,最强硬的SQL查询)使用JTable创建DefaultTableModel,使用SwingWorker填充JTable的数据移至BackGroung Tasks }或Runnable#Thread(在这种情况下输出到DefaultTableModel必须包装到invokeLater),在那里你可以通过将一个SQL查询(... LIMIT int, int)拆分成几个分开来使用Paginations查询并单独输出到JTable

  2. 对于标准查询,您可以使用基于AbstractTableModel的准备好的类(避免重新发明轮子),通过@camickr搜索ResultSetTableModel或最佳方式Table From Database / p>

答案 1 :(得分:2)

目前,每次调用getValueAt方法(称为批次)时,您都会执行查询。通常,数据库查询的速度不足以在此方法中使用(当然不是在使用远程数据库时)。

更好的方法是查询您的数据库一次(好吧,取决于您从数据库中检索的数据的大小),将其放在TableModel中并使用{{1}构建您的表}。

SO包含许多问题和答案,因此快速搜索会为您指出大量示例代码。我从其中一个问题中复制了this link。该页面上代码的所有学分当然都归作者(他也在这里,但我在SO上忘记了他的用户名)