4 Stimmen

Schnellste Möglichkeit, in einer Sqlite-Datenbank gespeicherte Zeichenfolgen zu durchsuchen

Ich habe eine große Anzahl von Zeichenketten, etwa 15.000, die ich mit dem folgenden Code in einer SQLite-Datenbank gespeichert habe:

 void addKey(String key, String value, String table) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_KEY, key); // Contact Name
        values.put(KEY_VALUE, value); // Contact Phone

        // Inserting Row
        db.insert(table, null, values);
        db.close(); // Closing database connection

    }

Und dann durchsuche ich diese Datenbank mit der folgenden Methode, um alle Zeichenfolgen herauszufiltern, die dem gesuchten Schlüssel entsprechen:

public String searchKeyString(String key, String table){
        String rtn = "";
        Log.d("searchKeyString",table);

            // Select All Query
            String selectQuery = "SELECT  * FROM " + table;

            SQLiteDatabase db = this.getWritableDatabase();
            Cursor cursor = db.rawQuery(selectQuery, null);

            // looping through all rows and adding to list
            if (cursor.moveToFirst()) {
                do {
                    Log.d("searchKeyString","searching");

                    if(cursor.getString(1).equals(key)) 
                        rtn = rtn + "," + cursor.getString(2);
                } while (cursor.moveToNext());
            }
            cursor.close();
            db.close();
            Log.d("searchKeyString","finish search");

        return rtn;
    }

Das Ziel ist es, dies in Echtzeit zu tun, während der Benutzer auf dem Keep Board tippt, so dass die Reaktionszeit entscheidend ist, und so wie es jetzt aussieht, dauert es über eine Sekunde, um die Suche zu durchlaufen.

Ich erwog Lesen alle Elemente in eine Array-Liste zunächst und Sortieren durch, die schneller sein könnte, aber ich dachte, eine Array-Liste dieser Größe könnte Speicherprobleme verursachen. Was ist der beste Weg, um durch diese Einträge in meiner Datenbank zu suchen?

8voto

Matthieu Punkte 15697

Es gibt ein paar Dinge, die Sie tun können...

  • Ändern Sie die Rückgabe in einen StringBuilder bis zum Ende.
  • Verwenden Sie nur eine lesbare Version der Datenbank (das macht wahrscheinlich keinen großen Unterschied)
  • Legen Sie nicht jedes Mal eine neue Instanz der Datenbank an, sondern lassen Sie sie geöffnet, bis Sie sie nicht mehr benötigen.
  • Fragen Sie nur das ab, was Sie mit dem Argument "WHERE" in der SQL-Abfrage benötigen.

Siehe den nachstehenden Code mit einigen Änderungen:

// move this somewhere else in your Activity or such
SQLiteDatabase db = this.getReadableDatabase();

public String searchKeyString(String key, String table){
    StringBuilder rtn = new StringBuilder();
    Log.d("searchKeyString",table);

        // Select All Query
        String selectQuery = "SELECT  * FROM " + table + " WHERE KEY_KEY=?";

        Cursor cursor = db.rawQuery(selectQuery,  new String[] {key});
        // you can change it to
        // db.rawQuery("SELECT * FROM "+table+" WHERE KEY_KEY LIKE ?", new String[] {key+"%"});
        // if you want to get everything starting with that key value

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                Log.d("searchKeyString","searching");

                rtn.append(",").append(cursor.getString(2));
            } while (cursor.moveToNext());
        }
        cursor.close();
        Log.d("searchKeyString","finish search");

    return rtn.toString();
}

Beachten Sie, auch wenn Sie wollen, dass dies in "Echtzeit" für den Benutzer geschehen, müssen Sie noch verschieben Sie diese zu einem separaten Thread oder ASyncTask oder Sie werden in Probleme laufen....

2voto

Sie sollten Folgendes in Betracht ziehen SELECT * FROM your-table LIMIT 50 zum Beispiel. Und Sie können zwei Schaltflächen "Zurück" und "Weiter" in Ihre Ansicht einfügen. Wenn jede Seite maximal 50 Einträge hat, der Benutzer auf Seite 1 ist und auf "Weiter" tippt, dann können Sie diese Abfrage verwenden:

SELECT * FROM your-table LIMIT 50 OFFSET 50

Wenn Ihre Tabelle hauptsächlich Textdaten enthält und Sie die Suche tief in Ihre Anwendung integrieren möchten, sollten Sie die Verwendung einer virtuellen Tabelle mit FTS .

0voto

mango Punkte 5567

Ich weiß nicht, ob es besser wäre, aber vielleicht wäre es schneller um die ausgewählten Zeichenfolgen nacheinander abzufragen.

public String searchKeyString(String key, String table){
    String rtn = "";
    Log.d("searchKeyString",table);

    // Select All Query
    String selectQuery = "SELECT  * FROM " + table + "WHERE column_1 = " + key;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        rtn = rtn + "," + cursor.getString(2);
    }
    cursor.close();
    db.close();
    Log.d("searchKeyString","finish search");

    return rtn;
}

EDIT:

Nun, ich weiß nicht, wie diese benutzerdefinierten Tastatur-Apps das machen, aber diese AutoCompleteTextViews mit Adaptern verbunden sind. Sie könnten genauso gut einen cursorAdapter und koppeln Sie Ihre Auto-Vervollständigen-Ansicht daran.

http://www.outofwhatbox.com/blog/2010/11/Android-autocompletetextview-sqlite-and-dependent-fields/

http://www.opgenorth.net/blog/2011/09/06/using-autocompletetextview-and-simplecursoradapter-2/

0voto

323go Punkte 14122

Lassen Sie sqlite die Arbeit machen.

Fügen Sie zunächst einen Index zu dem Feld hinzu, nach dem Sie suchen, falls Sie noch keinen haben. Zweitens: Führen Sie kein SELECT all mit manuellem Tabellenscan durch, sondern verwenden Sie eine Abfrage in der Form

SELECT column_value
  FROM my_table
 WHERE column_key LIKE "ABC%"

Dadurch wird die geringste Datenmenge zurückgegeben, und die Sql-Engine verwendet den Index.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X