我正在使用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();
}
使这项工作尽可能快的正确方法是什么?
答案 0 :(得分:2)
我从未接触过SqLite,也许我不同意Embedded databases可能太懒惰
(对于最难,最强硬的SQL查询)使用JTable创建DefaultTableModel,使用SwingWorker填充JTable
的数据移至BackGroung Tasks
}或Runnable#Thread
(在这种情况下输出到DefaultTableModel
必须包装到invokeLater
),在那里你可以通过将一个SQL查询(... LIMIT int, int)
拆分成几个分开来使用Paginations查询并单独输出到JTable
对于标准查询,您可以使用基于AbstractTableModel
的准备好的类(避免重新发明轮子),通过@camickr搜索ResultSetTableModel
或最佳方式Table From Database / p>
答案 1 :(得分:2)
目前,每次调用getValueAt
方法(称为批次)时,您都会执行查询。通常,数据库查询的速度不足以在此方法中使用(当然不是在使用远程数据库时)。
更好的方法是查询您的数据库一次(好吧,取决于您从数据库中检索的数据的大小),将其放在TableModel
中并使用{{1}构建您的表}。
SO包含许多问题和答案,因此快速搜索会为您指出大量示例代码。我从其中一个问题中复制了this link。该页面上代码的所有学分当然都归作者(他也在这里,但我在SO上忘记了他的用户名)