Pea*_*oto 5 sql android prepared-statement spatialite jsqlite
我正在查看Spatialite-Android的教程,我注意到以下代码示例:
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");
}
Run Code Online (Sandbox Code Playgroud)
特别是,我注意到,简单地将SQL查询串联在一起,而不是更合适的方法,例如Android SQLite库使用的方法.有没有办法让Spatialite使用真正准备好的语句?
为了清楚起见,我正在寻找类似的东西,使用Android中的标准SQLite数据库:
String query="SELECT * FROM table WHERE _id=?";
Cursor data=db.rawQuery(query,new String[]{id});
Run Code Online (Sandbox Code Playgroud)
有一些技巧.它们都使用exec()调用,该版本有3个参数.源代码中的声明是:
public void exec(String sql, jsqlite.Callback cb, String args[])
Run Code Online (Sandbox Code Playgroud)
jsqlite.Callback是一个接口,其中可以有几个.但最好的方法似乎是使用一个db.get_table(query,args)功能.%q是?Android SQLite表示中的有效替代品.这是给定代码的转换:
String query = "SELECT AsText(Transform(MakePoint(%q, %q, 4326), 32632));";
TableResult result=db.get_table(query,new String[]{""+TEST_LONG,""+TEST_LAT});
Run Code Online (Sandbox Code Playgroud)
从那里,你只需要从TableResult获得结果.没有方法调用从这里获取结果,您实际上必须获取公开声明的变量并手动解析它.这是一个如何做到这一点的例子.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您没有选择,请尝试以下方法:
TableResult result=new TableResult();
db.exec("ATTACH DATABASE %q AS newDb",result,new String[]{path});
Run Code Online (Sandbox Code Playgroud)
我假设相同的模式适用于INSERTS等