Spatialite Androidで準備済みステートメントを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com//questions/20013844

質問

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

特に、Android SQLiteライブラリーによって使用されるなど、より適切な方法ではなく、SQLクエリを単にSQLクエリを組み合わせることで、困難な練習が行われていることに気付きました。実際に準備されたステートメントを使用することができる方法はありますか?

ただクリアするために、Androidの標準SQLiteデータベースを使用して、このようなものを探しています。

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

役に立ちましたか?

解決

いくつかのトリックがあります。それらはすべてこのバージョンに3つの引数を持ちますexec()呼び出しを使用します。 ソースコードは次のとおりです。 / P>

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

私は同じパターンがインサートなどのために機能すると思います

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top