2012-12-06 3 views
1

테이블의 기본 설정을 업데이트하는 방법을 쓰고 있습니다. 테이블은 매우 간단합니다 : 두 개의 열, 첫 번째는 설정 유형을 나타내는 레이블, 두 번째는 설정 값을 저장합니다.SQLite 커서 동작 이해

실행 중이 시점에서 테이블은 비어 있습니다. 나는 단지 초기 값을 설정하고있다. 그래서, 나는이 커서가 다시 비어있을 것으로 기대한다. 하지만 대신 오류가 발생합니다 (아래 참조). 내가 작업하고있는 설정은 "lastPlayer"라고하며 "SETTINGS_TABLE"의 "SETTING_COLUMN"에 저장되어 있어야합니다.

public static void updateSetting(String setting, String newVal) { 
    String table = "SETTINGS_TABLE"; 
    String[] resultColumn = new String[] {VALUE_COLUMN}; 
    String where = SETTING_COLUMN + "=" + setting; 
    System.err.println(where); 

    SQLiteDatabase db = godSimDBOpenHelper.getWritableDatabase(); 
    Cursor cursor = db.query(table, resultColumn, where, null, null, null, null); 
    System.err.println("cursor returned"); //I never see this ouput 

     \\more 
} 

sqlite가 반환 : 오류 코드 = 1, MSG = 그런 칼럼 :

lastPlayer

왜 그런 lastPlayer이 없음을 말하고 다음 코드는 없다? 나는 "SETTING_COLUMN"열을보고 해당 열이 "lastPlayer"값을 갖는 레코드를 반환하도록 쿼리에 지시했다고 생각했습니다. 나는 혼란스러워. 누군가 나를 똑바로 쓸 수 있습니까? 나는 한 시간 동안 이것을보고 있었고, 내가 잘못하고있는 것을 보지 못했다.

감사합니다.

+1

이 당신의 목적을 위해 더 나은 (그리고 훨씬 덜 사용하기 복잡)입니다. – Jong

+0

좋습니다. 나는 그것을 들여다보고 이것으로 다시 돌아갈 것입니다. – Alex

답변

2

쿼리를 올바르게 작성하거나 이스케이프 처리하지 않았습니다. lastPlayer 값이 따옴표 안에 없기 때문에 문에 두 개의 열이 동일한 지 여부가 확인됩니다. 이는 두 개의 오류 메시지가 말하는 것입니다.

쿼리를 올바르게 작성하려면 문자열 연결을 사용하여 수동으로 수행하지 않는 것이 가장 좋습니다. 대신, 매개 변수 selectionArgsSQLiteDatabase.query()입니다.

쿼리의 매개 변수는 ?으로 정의한 다음 selectionArgs을 기준으로 작성해야합니다. 워드 프로세서에서 :

당신은 포함 할 수의 선택에서, 그들은 선택에 나타나는 selectionArgs에서 순서대로 값 으로 대체 될를?. 값은 문자열로 바인딩됩니다.

그래서, 당신의 코드는 다음과 같습니다 된 SharedPreferences를 사용

String where = SETTING_COLUMN + " = ?"; 
Cursor cursor = db.query(table, resultColumn, where, new String[] { setting }, null, null, null); 
+0

그게 전부 였어. SQLite에 대한 새로운 것을 배웠습니다. 고맙습니다! – Alex

관련 문제