2011.07.05
【Android】SQLiteのクエリ作成
AndroidにはSQLiteが標準でついている。
しかし、どちらが悪いのかはしらないけれど安全なクエリを作成しようとすると
一部機能がかけたりしてるのでまとめてみます。
SQLiteStatementを使うことで Java等 でよく使う ?置換 を行える
Link:Android:SQLiteStatementクラス
SQLiteStatement stmt; stmt = sdb.compileStatement("INSERT INTO rss( url ) VALUES( ? );"); stmt.bindString( 1, szUrl ); //String以外には以下のものがあり //bindBlob //bindDouble //bindLong //bindNull //実行 stmt.executeInsert();
これでインジェクション攻撃に強くなるかと思いきや
これは結果をほとんど返さない処理でないと使えないらしい。
いわゆる、SELECTでは使えない。
SelectではSQL文を作成するしか道はなさそう
メモ)
SQLiteDatabase.queryというので引数を指定するだけでできるようなものもあるみたいけど
ぱっと見使い方がわからないので放置
引数のエスケープは DatabaseUtils.sqlEscapeString を使うとよさげ
Link:Android:DatabaseUtilsクラス
SQLiteDatabase.rawQueryを使えば通常のSelectを処理することができる。
返り値はCursorというものになる。
Link:Android:SQLiteDatabaseクラス Android:Cursorクラス
使い方はこんな感じ
//猫の名前をユーザー入力で検索することを仮定 //sqlEscapeStringは自動的にクオートをつけてくれる String szSql; szSql = "SELECT * FROM neko WHERE name=" + DatabaseUtils.sqlEscapeString( szName ) + ";"; //クエリを実行して読み出し用カーソルを取得 Cursor c; c = sdb.rawQuery( szSql, null ); //先頭より処理開始 c.moveToFirst(); while( true ) { //こんな感じで1列目を取得 String szWork = c.getString(0); //最後であれば終了 if( c.isLast() == true ) { break; } else { //次の行へ c.moveToNext(); } } //とじる c.close();
と、こんな感じでやっていくと安全だと思ってみる。
まあ、盗まれていいものをローカルのDBにおくのが間違いといわれればそうかもしれない
だけどDBがあるとないとでは世界が違ってくるので
有効につかっていきたいの~
関連記事