복붙노트

[SQL] 안드로이드에서 준비된 문으로 쿼리?

SQL

안드로이드에서 준비된 문으로 쿼리?

안드로이드에서 android.database.sqlite.SQLiteStatement 나를 주입 공격을 피하기 위해 SQLite는에 준비된 문을 사용할 수 있습니다. 그것의 실행 방법은 / 업데이트 / 삭제 작업을 만들 적합하지만 커서 또는 반환 등의 쿼리에 대한 방법이있을 것 같지 않습니다.

이제 아이폰 OS에 나는 * 형 sqlite3_stmt의 준비된 문을 만들고 난이 SQLite는의 제한되지 않습니다 알 수 있도록, 쿼리를 사용합니다. 어떻게 안드로이드에서 준비된 문으로 쿼리를 수행 할 수 있습니다?

해결법

  1. ==============================

    1.준비된 문을 사용하면 두 가지를 수행 할 수 있습니다

    준비된 문을 사용하면 두 가지를 수행 할 수 있습니다

    (- 여기에서 볼 afiak sqlite3_prepare_v2되지 않음) 그러나 그것은 그렇지 않으면 당신은 컴파일 된 SQL 문을 캐시 오류 MAX의 크기에 도달되지 수 사용합니까 정확히 / 안드로이드 SQLite는 구현이 실제로 sqlite3_prepare를 사용하는 경우 모르겠어요.

    그래서 당신은 당신은 내가 SQLiteStatement으로 작업을 수행하는 알고있는 방법이 없습니다 구현에 의존 할 필요가 데이터베이스를 조회 할 경우.

    사출 안전, 모든 데이터베이스 쿼리, 삽입 등의 방법에 관한 것은 바인드 인수로 허용 (때로는 대안) 버전이 있습니다.

    예를 들면 당신의 커서를 얻으려면

    SELECT * FROM table WHERE column1='value1' OR column2='value2'
    

    커서의 SQLiteDatabase # rawQuery (

    )

    Cursor c1 = db.rawQuery(
        "SELECT * FROM table WHERE column1=? OR column2=?",
        new String[] {"value1", "value2"}
    );
    

    커서의 SQLiteDatabase # 쿼리 (

    )

    Cursor c2 = db.query("table", null, 
         "column1=? OR column2=?", 
          new String[] {"value1", "value2"},
          null, null, null);
    

    ContentProviders 통해 -이 경우는 추상적 인 공급자가 아닌 데이터베이스와 상호 작용하면 이후 약간 다릅니다. 컨텐트 프로를 백업 SQLite는 데이터베이스가 있음을 보장 acutally 없습니다. 당신이 거기에 어떤 열 알지 못한다면 그래서 / 공급자가 내부적으로 어떻게 작동하는지 당신은 문서의 말씀에 충실해야한다.

    커서 컨텐트 리졸버 # 쿼리 (

    )

    Cursor c3 = getContentResolver().query(
         Uri.parse("content://provider/table"), null,
         "column=? OR column2=?", 
          new String[] {"value1", "value2"},
          null);
    

    힌트 : 당신이 여기 제한 할 경우 ORDER BY 절에 추가 할 수 있습니다 :

    String sortOrder = "somecolumn LIMIT 5";
    

    또는 컨텐트 프로 바이더의 구현에 따라서는 열린 우리당에 매개 변수로 추가 :

    Uri.parse("content://provider/table?limit=5");
    // or better via buildUpon()
    Uri audio = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    audio.buildUpon().appendQueryParameter("limit", "5");
    

    모든 경우에 ? 당신이 바인드 인수에 무엇을 넣어의 탈출 버전으로 대체됩니다.

    ? + "hack'me"= 'hack''me'

  2. from https://stackoverflow.com/questions/9857073/queries-with-prepared-statements-in-android by cc-by-sa and MIT license