2014-01-10 2 views
0

나는 다음과 같은 쿼리 내 테이블을 업데이트하기 위해 노력했습니다 : 테이블 필드 내부 쿼리 COLUMN을 값을 업데이트하지 않습니다원시 쿼리로 데이터베이스 업데이트가 테이블을 업데이트하지 않습니까?

String updateQuery = "UPDATE TABLE SET COLUMN = 'HELLO' || COLUMN;" 
dataBase.rawQuery(updateQuery,null); 

.

그러나 나는 다음과 같은 명령을 실행할 때 테이블이 업데이트되는 : 나는 테이블이었다 updateCursor.close() 이상을 추가로 테이블이 즉시 자동으로 업데이트하지 않았지만 updateCursor.moveToFirst()을 사용하지 않고 명령을 실행

String updateQuery = "UPDATE TABLE SET COLUMN = 'HELLO' || COLUMN;" 
Cursor updateCursor = dataBase.rawQuery(updateQuery,null); 
updateCursor.moveToFirst(); 
updateCursor.close(); 

업데이트되었습니다. 나는 그것에 대해 많이 조사했지만 문서 나 블로그에서 아무것도 찾지 못했습니다. 이 문제의 원인을 이해하도록 도와주세요. 미리 감사드립니다.

답변

3

결과를 반환하지 않을 경우 rawQuery을 사용할 필요가 없습니다. 커서를 제대로 닫으려면 두 번째 작업을 수행해야합니다.

대신 execSQL 또는 더 세련된 update 메서드를 사용할 수 있습니다.

을 당신은 당신이 당신이 그것을 사용하는 것이 확실 할 때까지 데이터를 읽는 지연 할 것이다 데이터베이스에서 읽고있는 SQL 쿼리가있는 경우 : 당신이 생각하는 이유를 이해하려면

.

rawQuery으로 전화하면 Cursor 개체에 대한 참조를 얻을 수 있습니다. 그러나 아직 읽는 것은 없습니다. 이것이 moveToFirst의 기능입니다. 이 SQL 쿼리 실행에 대해 진지하다는 것을 커서에 알려주고 결과를 원한다는 것이 가장 먼저 나타납니다.

그러나 업데이트에 rawQuery을 사용하고 있으므로 moveToFirst으로 결과를 가져 오기 전에 데이터베이스에 아무 것도 전달되지 않습니다.

따라서 실제로 결과를 요청하지 않고도 SQL 쿼리를 실행하는 execSQL을 사용해야합니다.

+0

나는 당신이 동의한다면, 내가 원한다면 나는이 쿼리를 피할 수 있었을 것이다. 단지 나의 이해를 위해서, 나는 왜 'updateCursor.moveToFirst();'가 필요한지 알고 싶다. – CodeWarrior

+0

잘 모르겠습니다. 관련된 클래스의 소스 코드를 찾으려고 할 수 있습니다. 이것은 그 중 하나 일뿐입니다. – doorstuck

+0

소스 코드를 보았습니다. ** 파라미터 : ** SQL SQL 쿼리. SQL 문자열은 다음과 같아야합니다. finishedselectionArgs 질의에 where 절을 포함 할 수 있습니다.이 절은 selectionArgs의 값으로 대체됩니다. 값은 문자열로 바인딩됩니다. ** 커서 객체 **는 첫 번째 항목 앞에 배치됩니다. **. 커서는 동기화되지 않습니다. 자세한 내용은 문서를 참조하십시오. – CodeWarrior

관련 문제