0

我有一个 SQLite 数据库,其中的表有 ~90000 行。这是需要很长时间才能完成的方法。

void intilizeAyaHighlighShapes() {
        ayaShapes = new ArrayList<ArrayList<AyaShape>>();
        ArrayList<AyaShape> ayaRowsHighlight = new ArrayList<AyaShape>(); // contains the highligh shapes of a specific aya for all its rows

        int tmpAya = 1, tmpLineMin = 0, tmpLineMax = 0;
        int maxLeft = 0, maxRight = 0, maxTop = 0, maxBottom = 0;

        SQLiteDatabase db = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory() + "/ayahinfo_800.db", null, SQLiteDatabase.OPEN_READONLY);
        Cursor cursor = null;

        while (tmpAya < Database.AyatNumberInSura[suraIndex]) {
            cursor = db.rawQuery("SELECT MIN(line_number) FROM glyphs WHERE(sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya) + ")",
                    null);
            cursor.moveToFirst();
            tmpLineMin = cursor.getInt(0);

            cursor = db.rawQuery("SELECT MAX(line_number) FROM glyphs WHERE(sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya) + ")",
                    null);
            cursor.moveToFirst();
            tmpLineMax = cursor.getInt(0);


            for (int i = tmpLineMin; i <= tmpLineMax; i++) {
                cursor = db.rawQuery("SELECT MAX(max_x) FROM glyphs WHERE (sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya)
                        + " AND line_number=" + Integer.toString(i) + ")", null);
                cursor.moveToFirst();
                maxRight = cursor.getInt(0);

                cursor = db.rawQuery("SELECT MIN(min_x) FROM glyphs WHERE (sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya)
                        + " AND line_number=" + Integer.toString(i) + ")", null);
                cursor.moveToFirst();
                maxLeft = cursor.getInt(0);

                cursor = db.rawQuery("SELECT MAX(max_y) FROM glyphs WHERE (sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya)
                        + " AND line_number=" + Integer.toString(i) + ")", null);
                cursor.moveToFirst();
                maxBottom = cursor.getInt(0);

                cursor = db.rawQuery("SELECT MIN(min_y) FROM glyphs WHERE (sura_number=" + Integer.toString(suraIndex + 1) + " AND ayah_number=" + Integer.toString(tmpAya)
                        + " AND line_number=" + Integer.toString(i) + ")", null);
                cursor.moveToFirst();
                maxTop = cursor.getInt(0);



                ayaRowsHighlight.add(new AyaShape(maxLeft, maxRight, maxTop, maxBottom));
            }

            ayaShapes.add(ayaRowsHighlight);
            ayaRowsHighlight.clear();
            tmpAya++;

        }





        cursor.close();
        db.close();

    }

这段代码的哪些部分可能导致它需要这么长时间?
我应该在这里写下这段代码的目的吗?

4

1 回答 1

0

您可以简单地将多个查询与相同的 WHERE 条件组合起来:

SELECT MIN(line_number), MAX(line_number)
 FROM glyphs
 WHERE sura_number = ? AND ayah_number = ?

和:

SELECT MAX(max_x), MIN(min_x), MAX(max_y), MIN(min_y)
 FROM glyphs
 WHERE sura_number = ? AND ayah_number = ? AND line_number = ?

但是,您的算法实际上并不需要它,tmpLineMin并且在处理各个字形边界之前tmpLineMax是已知的。因此,您可以通过使用单个查询然后单步执行结果行(每个行号一个)来进一步加快速度:

SELECT line_number, MAX(max_x), MIN(min_x), MAX(max_y), MIN(min_y)
 FROM glyphs
 WHERE sura_number = ? AND ayah_number = ?
 GROUP BY line_number
 ORDER BY line_number
于 2012-09-11T17:53:53.983 回答