2013-11-16 3 views
5

Я смотрю на tutorial for Spatialite-Android, и я заметил следующие примеры кода:Как использовать подготовленный оператор в 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"); 
} 

В частности, я заметил, что плохая практика делаются просто нанизыванием запроса SQL, вместо того, чтобы более правильного метод, который используется библиотекой Android SQLite. Есть ли способ заставить Spatialite использовать настоящие подготовленные заявления?

Просто чтобы быть ясно, я ищу что-то вроде этого, используя стандартную базу данных SQLite в Android:

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

ответ

5

Есть несколько трюков. Все они используют вызов exec(), который имеет 3 аргумента для этой версии. Заявление от the source code является:

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

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

Оттуда вы просто должны получить результаты от 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); 
    } 
} 

Если вы не делаете отборное, попробовать что-то вроде этого:

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

Я предполагаю, что по той же схеме будет работать INSERTS и т.п.

+0

Это похоже на работу для некоторых заявлений , но не выполняется для вставных операторов. Любая идея, как выполнить вставку? – robguinness

+0

Не нужно было вставлять, так что ... – PearsonArtPhoto

 Смежные вопросы

  • Нет связанных вопросов^_^