Pergunta

Estou olhando para o tutorial para Spatialite-Android, e estou notando os seguintes exemplos de código:

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

Em particular, percebi que a prática inadequada é simplesmente encadear uma consulta SQL, em vez de um método mais adequado, como o usado pela biblioteca SQLite do Android.Existe uma maneira de fazer com que o Spatialite use declarações preparadas verdadeiras?

Só para deixar claro, estou procurando algo assim, usando o banco de dados SQLite padrão no Android:

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

Solução

Existem alguns truques.Todos eles usam a chamada exec(), que possui 3 argumentos para esta versão.A declaração de o código fonte é:

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

Um jsqlite.Callback é uma interface, que pode haver várias.Mas a melhor maneira parece ser usar um db.get_table(query,args) função. %q é o substituto efetivo para ? na representação Android SQLite.Aqui está a transformação do código fornecido:

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

A partir daí, basta obter os resultados do TableResult.Não há uma chamada de método para obter os resultados daqui; na verdade, você precisa pegar a variável declarada publicamente e analisá-la manualmente.Aqui está um exemplo de como isso pode ser feito.

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

Se você não estiver selecionando, tente algo assim:

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

Presumo que o mesmo padrão funcionará para INSERTS e similares

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top