我的 SQLite 数据库中有带有附加列的单词列表。我只想获取单词列表(基本上是单列)。下面是我如何做的代码。
Cursor c = db.rawQuery("select word from wordlist", null);
if (c.moveToFirst()) {
do {
words.add(c.getString(c.getColumnIndex("word")));
} while (c.moveToNext());
}
c.close();
它可以工作,但速度很慢。例如,对于大约 100K 单词,需要接近 1 秒。但是,如果我只有文本文件中的单词列表,则可以在大约 100 毫秒内读取它。
是否有任何方法可以将 SQLite DB 中的单列直接读取到列表中,而不是获取游标并迭代它以获取所有值?如果不是,更好的解决方案是什么?只需返回文本文件即可?
最佳答案
我没有性能问题,所以我懒得尝试这个,但是这样的东西表现如何?这个想法是确保缓冲区 (CursorWindow
) 得到充分利用,然后直接从该缓冲区读取,而不是让光标进行中介。 CursorWindow
甚至有一个构造函数,允许您覆盖默认缓冲区大小(如果您想尝试一下的话)。
我相当有信心,这与 android 所能提供的最接近 sqlite 的性能一样,因此,如果这样的方法不能改善情况,您必须 bundle 自己的 sqlite 或使用不同的存储机制。
try(Cursor c = db.rawQuery("select word from wordlist", null))
{
c.setFillWindowForwardOnly(true);
CursorWindow window = new CursorWindow("nameForDebugging");
c.setWindow(window);
if (c.moveToFirst())
{
int index = 0;
do
{
int count = window.getNumRows();
for(int x = 0; x < count; ++x)
words.add(window.getString(index++, 0));
} while((count != 0) && c.moveToPosition(index));
}
}
关于java - 获取 SQLite 单列结果列表的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58115340/