Frage

Ich schaue mir das an Tutorial für Spatialite-Android, und mir fallen die folgenden Codebeispiele auf:

String query = "SELECT AsText(Transform(MakePoint(" + TEST_LON + ", " + TEST_LAT + ", 4326), 32632));";
sb.append("Execute query: ").append(query).append("\n");
try {
    Stmt stmt = db.prepare(query);
    if (stmt.step()) {
        String pointStr = stmt.column_string(0);
        sb.append("\t").append(TEST_LON + "/" + TEST_LAT + "/EPSG:4326").append(" = ")//
                .append(pointStr + "/EPSG:32632").append("...\n");
    }
    stmt.close();
} catch (Exception e) {
    e.printStackTrace();
    sb.append(ERROR).append(e.getLocalizedMessage()).append("\n");
}

Insbesondere ist mir aufgefallen, dass es schlecht praktiziert wird, eine SQL-Abfrage einfach aneinanderzureihen, anstatt eine geeignetere Methode zu verwenden, wie sie beispielsweise von der Android SQLite-Bibliothek verwendet wird.Gibt es eine Möglichkeit, Spatialite dazu zu bringen, echte vorbereitete Aussagen zu verwenden?

Um es klarzustellen: Ich suche so etwas unter Verwendung der Standard-SQLite-Datenbank in Android:

String query="SELECT * FROM table WHERE _id=?";
Cursor data=db.rawQuery(query,new String[]{id});
War es hilfreich?

Lösung

Es gibt ein paar Tricks.Sie alle verwenden den Aufruf exec(), der für diese Version drei Argumente hat.Die Aussage von der Quellcode Ist:

public void exec(String sql, jsqlite.Callback cb, String args[])

Ein jsqlite.Callback ist eine Schnittstelle, von der es mehrere geben kann.Aber der beste Weg scheint die Verwendung von a zu sein db.get_table(query,args) Funktion. %q ist der wirksame Ersatz für ? in der Android SQLite-Darstellung.Hier ist die Transformation des angegebenen Codes:

String query = "SELECT AsText(Transform(MakePoint(%q, %q, 4326), 32632));";
TableResult result=db.get_table(query,new String[]{""+TEST_LONG,""+TEST_LAT});

Von dort müssen Sie nur noch die Ergebnisse von TableResult abrufen.Es gibt hier keinen Methodenaufruf, um die Ergebnisse zu erhalten. Sie müssen tatsächlich die öffentlich deklarierte Variable abrufen und sie manuell analysieren.Hier ist ein Beispiel, wie das gemacht werden kann.

TableResult result=db.get_table(query,new String[]{""+lng,""+lat});
Vector<String[]> rows=result.rows;
for (String[] row:rows)
{
    for (String val:row)
    {
        Log.v(TAG,val);
    }
}

Wenn Sie keine Auswahl durchführen, versuchen Sie etwas wie Folgendes:

TableResult result=new TableResult();
db.exec("ATTACH DATABASE %q AS newDb",result,new String[]{path});

Ich gehe davon aus, dass das gleiche Muster für INSERTS und dergleichen funktioniert

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top