2

지금까지 저는 우수 사례와 같은 쿼리에서 SQLite 선택 인수를 바인딩하기 위해 많은 노력을 기울였습니다. 그러나 거의 작동하지 않았습니다. 정확한 이유가 궁금합니다. 이제 FROM 절의 하위 쿼리가 원인 일 수 있음을 알게되었습니다. 예를 ...SQLite 바인드 인수 - WHERE 절로만 제한됩니까?

SELECT X(result) as x, Y(result) as y, Z(result) as z FROM (select Transform(MakePointZ(?, ?, 0.0, ?), ?) as result); 

와 자바 코드를 들어

double x, y, z; 
int source, target; 
final String[] selectionArgs = new String[] { 
        String.valueOf(x), 
        String.valueOf(y), 
        String.valueOf(z), 
        String.valueOf(source), 
        String.valueOf(target) }; 
Cursor c = db.rawQuery(sql, selectionArgs); 

누군가가 절에 오류가있는 WHERE 외부 인수를 사용하는 경우 확인하거나 인수가 미세 어디에 나를 설명 할 수 ... 같은 것입니다 놓을까요?

p.s. 사실 SQLite의 확장 인 Spatialite를 사용하지만 순수하고 손댈 수없는 SQLite를 기반으로합니다.

+0

쿼리를 실행하는 코드를 보여주십시오. –

+0

방금 ​​질문을 업데이트했습니다. – WindRider

답변

4

Parameters은 리터럴 값이 허용되는 모든 위치에서 사용할 수 있습니다. 귀하의 SQL 쿼리 자체가 잘 보인다.

그러나 Android 데이터베이스 API는 문자열 매개 변수를 사용해야하므로 모든 매개 변수 값은 데이터베이스에서 문자열로 표시됩니다. 이렇게하면 많은 비교가 실패하거나이 값에 대해 수행 된 다른 작업이 중단됩니다.

매개 변수는 서식 문제와 SQL 주입 공격이 가능한 문자열에서 가장 중요합니다. 일반 숫자의 경우 SQL 문자열에 직접 삽입하면됩니다. 또는 다시 데이터베이스의 숫자에 convert 문자열 값 :

MakePointZ(CAST(? AS REAL), CAST(? AS REAL), ...) 
2

WHERE 절 밖에서 인수를 사용하여 오류 또는 인수가 배치 될 좋은 곳 설명해 경우 다른 사람이 확인할 수 있을까요?

? 리터럴이 유효 할 때마다 대체가 작동합니다.

예제 코드에서 ? 자리 표시 자와 바인드 인수의 수가 일치하지 않아 예외가 발생합니다.