Pregunta

Estoy buscando en el tutorial para Spatialite-Android, y estoy notando los ejemplos de código siguientes:

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");
}

En particular, me di cuenta de que la mala práctica es el hecho de simplemente juntar una consulta SQL, en lugar de una más adecuada método, tal como es utilizado por el Android biblioteca SQLite.Hay una manera que puedo hacer Spatialite uso verdadero de declaraciones preparadas?

Para que quede claro, yo estoy buscando algo como esto, usando el estándar de base de datos SQLite en Android:

String query="SELECT * FROM table WHERE _id=?";
Cursor data=db.rawQuery(query,new String[]{id});
¿Fue útil?

Solución

Hay un par de trucos.Todos ellos utilizan el exec() de la llamada, que tiene 3 argumentos para esta versión.La declaración de el código fuente es:

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

Un jsqlite.De devolución de llamada es una interfaz, de la cual no puede ser de varios.Pero la mejor manera parece ser el uso de un db.get_table(query,args) la función. %q es la efectiva sustitución de ? en el Android SQLite representación.Aquí está la transformación de un determinado código:

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

Desde allí, usted sólo tiene que conseguir los resultados de TableResult.No hay una llamada al método para obtener los resultados a partir de aquí, se tiene que agarrar la declaró públicamente variable y analizar manualmente a través de ella.He aquí un ejemplo de cómo puede hacerse.

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);
    }
}

Si usted no está haciendo un select, intentar algo como esto:

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

Supongo que el mismo patrón de trabajo para INSERCIONES y como

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top