0

userName がわかっている場合、userId を取得しようとしています。たとえば、私が作成した以下の関数では、userName を受け取り、userId を分割します。ただし、アプリがクラッシュしています。したがって、これをコメントアウトすると、次の関数に何か問題があるに違いないと考えました。アプリは正常に動作します。

public int getUserId(String userName){
        SQLiteDatabase db = this.getReadableDatabase();
        String query = "SELECT userId from users WHERE userName=" + userName;

        Cursor cursor = db.rawQuery(query, null);
        // Move to first row
        cursor.moveToFirst();

        int userId = cursor.getInt(cursor.getColumnIndex("userId"));

        return userId;
    }

編集:

また、次のコードを使用して userId を共有設定に保存しようとしていますが、これも問題を引き起こしているようです。

   private void saveUserId(String key, int value) {
       settings = getSharedPreferences("MYPREFS", 0);
       editor = settings.edit();
       editor.putInt(key, value);
       editor.commit();
           }
4

3 に答える 3

0

問題は、ユーザー名を文字列に直接挿入し、SQL 式として読み取られることです。

理論的には、文字列を引用符 ( ') で囲むこともできますが、文字列に引用符やその他の特殊文字が含まれていると問題が発生します。SQL ステートメントで文字列値を使用する最も安全な (そして最も簡単な) 方法は、パラメーターを使用することです。

public int getUserId(String userName) {
    SQLiteDatabase db = getReadableDatabase();
    String query = "SELECT userId FROM users WHERE userName = ?";
    String[] parameters = new String[] { userName };
    Cursor cursor = db.rawQuery(query, parameters);
    if (cursor.moveToFirst())
        return cursor.getInt(0);
    else
        return -1; // not found
}
于 2013-11-12T12:08:29.557 に答える