Domanda

Sto guardando il tutorial per Spatialite-Android , e sto notando i seguenti campioni di codice:

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

In particolare, ho notato che è stata effettuata una pratica pratica di semplicemente stringhe insieme una query SQL, invece di un metodo più appropriato, come ad esempio utilizzato dalla libreria Android SQLite.C'è un modo in cui posso fare spazialite usa le dichiarazioni preparate vere?

Solo per essere chiaro, sto cercando qualcosa di simile, usando il database standard SQLite in Android:

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

È stato utile?

Soluzione

Ci sono alcuni trucchi. Usano tutti la chiamata Exec (), che ha 3 argomenti per questa versione. La dichiarazione da Il codice sorgente è: < / P >.

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

A jsqlite.callback è un'interfaccia, di cui possono esserci diversi. Ma il modo migliore sembra usare una funzione db.get_table(query,args). %q è la sostituzione effettiva per ? nella rappresentazione Android SQLite. Ecco la trasformazione del codice specificato:

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

Da lì, devi solo ottenere i risultati da TableReSult. Non c'è una chiamata di metodo per ottenere i risultati da qui, devi effettivamente afferrare la variabile dichiarata pubblicamente e analizzarsi manualmente attraverso di esso. Ecco un esempio di come può essere fatto.

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 non stai facendo un select, prova qualcosa del genere:

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

Suppongo che lo stesso schema funzioni per gli inserti e simili

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top