私のアプリは3つのデータベースがあらかじめ同梱されています。 1つは大きく、大部分は長い文を含む293,092行です。私の問題は、私がクエリ(rawQuery)ワーカースレッドでも大きなもの、UIはおそらく1秒間フリーズするたびにです。大規模なSQLite DBをクエリすると、別のスレッドで実行されてもUIがフリーズする
はここに私のクエリ文です:私は意図的にちょうど1行(1つの結果)を照会しても
SELECT verse
FROM Translations
WHERE translatorId = ?
AND chapterNbr = ?
AND verseNbr BETWEEN ? AND ?
ORDER BY chapterNbr , verseNbr
ここでの問題があり、UIがまだフリーズします。
助けてください。どうもありがとうございました。私が代わりにDB.trans.dbのDB.user.dbを使用していたときに上記
static void setVerseAdapter(final int[][] refs) {
surahThread = new Thread(new Runnable() {
@Override
public void run() {
Cursor cursor = Translations.getTranslators();
final int[] translationIds = new int[cursor.getCount()];
while (cursor.moveToNext()) {
translationIds[cursor.getPosition()] = cursor.getInt(0);
}
adapterVerses = new AdapterVerses
(context, getVersesArray(refs), Translations.getTranslationsArray(translationIds, refs)); // this one is the problem, the getTranslationsArray
// remaining code in this method is irrelevant ...
});
surahThread.start();
}
static Cursor[][] getTranslationsArray(int[] translationIds, int[]... refs) {
if (!Settings.showTranslation)
return new Cursor[][]{{}};
Cursor[][] translations = new Cursor[refs.length][];
for (int i = 0; i < refs.length; i++) {
int start = refs[i][0];
int end = refs[i][1];
int surahNbr = refs[i][2];
translations[i] = getTranslations(translationIds, start, end, surahNbr);
}
return translations;
}
static Cursor[] getTranslations(int[] translatorIds, int start, int end, int surahNbr) {
Cursor[] translations = new Cursor[translatorIds.length];
for (int i = 0; i < translatorIds.length; i++) {
translations[i] = readTrans(
"SELECT verse " +
"FROM Translations " +
"WHERE translatorId = ? " +
"AND surahNbr = ? " +
"AND verseNbr BETWEEN ? AND ? " +
"ORDER BY surahNbr, verseNbr",
translatorIds[i], surahNbr + 1, start, end
);
}
return translations;
}
static Cursor readTrans(String query, Object... args) {
SQLiteDatabase transDb = transExists ? DB.trans.db : DB.user.db; // using user.db results to no freezing
return transDb.rawQuery(replaceArgs(query, args), null);
}
すべてが正常に動作します:
は、ここに私の非常に長いコードです。それらの違いはサイズです。最初のものは〜4MBであり、2番目のもの(問題のあるもの)は解凍時に約65MBです。
ありがとうございます。
[mcve]を入力してください。これには、データベースを照会するコードと、クエリから返される 'Cursor'を使用するコードが含まれます。 – CommonsWare
私は自分の質問を更新しました。ありがとうございました。 –
あなたのコードは...困惑しています。あなたはまた、急速に連続してたくさんのクエリを作成しています。それは一般的にパフォーマンスが低下する原因になります。特にスレッディングに関しては、あなたがバックグラウンドスレッド*中にある間に*データベースから戻ってくる*すべての 'Cursor 'で何かをしていることを確認してください。 'query()'や 'rawQuery()'のようなメソッドは実際にはクエリを実行しません。彼らは 'Cursor 'を設定しますが、' Cursor'(遅延評価)を使って実際に何かを行うまでクエリは実行されません。他のものがなければ、 'getCount()'を呼び出します。 – CommonsWare