Как использовать подготовленное утверждение в 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-запроса, а не в более подходящем методе, например, используемом библиотекой SQLite для Android. Есть ли способ, которым я могу заставить Spatialite использовать действительно подготовленные заявления?

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

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

1 ответ

Решение

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

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

Я предполагаю, что тот же шаблон будет работать для вставок и тому подобное

Другие вопросы по тегам