2010-04-27 2 views
1

SQLite DB에서 커서로 무작위로 20 개의 질문 (행)을 가져오고 모든 질문을 통해 사용자에게 20 개의 질문을 모두 묻는 안드로이드 응용 프로그램이 있습니다.커서 인스턴스를 활동 인스턴스로 저장 하시겠습니까?

활동이 일시 중지되거나 중지되었을 때 커서의 상태/위치를 저장하는 방법이 있습니까? 즉, 활동이 재개 될 때 커서가 복원되고 활동이 일시 중지/중지되었을 때와 동일한 위치에 있습니까?

내 코드를 게시해야하는 경우 그냥 물어보십시오.

시간 내 주셔서 감사합니다. 그것은, 너무처럼 onPause 방법에 몇 가지 코드를 매우 쉽게 넣고 있었다 위치를 저장 얻기

답변

2

:

위치가 클래스 필드 (즉, 일반적으로, 어떤 방법 이외의 선언은
protected void onPause(){ 
position = yourCursor.getPosition(); 
super.onPause(); 
} 

상단). 그런 다음 onResume에서 커서를 해당 위치로 다시 이동할 수 있습니다. onPause()/onResume()에 익숙하지 않은 경우 activity lifecycle에서 읽으십시오. 그러나 무작위로 선택한 질문을 저장하고 싶다고 생각합니다. 나는 커서가 onPause/onResume에서 계속 유지 될 것이라고 생각하지 않는다. 왜냐하면 일반적으로 메모리 문제를 피하기 위해 onPause에서 닫혀 있기 때문이다. 내가 생각할 수있는 유일한 방법은 아니지만 전문가가 아니기 때문에 질문의 rowID를 저장 한 다음 데이터베이스를 다시 쿼리하여 해당 행을 가져와야합니다. 이 솔루션이 얼마나 어색한지는 처음부터 임의의 질문을 어떻게 쿼리하는지에 달려 있습니다. 이미 20 개의 난수를 생성 한 다음 쿼리에 피드를 제공하면 동일한 방법을 사용하지만 대신 저장된 20 개의 행을 다시 사용할 수 있습니다. 그게 내가 무슨 - 당신은 동일한 커서를 다시 만들 수없는 경우 실제로, 커서 상태 않고 위치를 저장하는 것은 꽤 쓸모가 :

@Ryan :


이는 주석으로 너무 길어했다 내 대답의 후반에 말하기. 귀하의 RANDOM()이 표준 SQL 함수라고 가정합니다. 그런데 안드로이드의 구문은 무엇입니까? 데이터베이스를 받아 들일 수 없었습니다. 그렇다면 무작위 방법을 사용하여 커서를 다시 만들어야 할 수도 있습니다. "행 ID = 또는 OR rowId =? OR rowId =? OR ...."를 사용하여 데이터베이스를 다시 쿼리하면 원래 커서에서 검색 한 행 ID가 선택 항목으로 사용됩니다. 그것은 꽤 아니지만 아마 그것을 할 수있는 더 좋은 방법이 있습니다,하지만 그것은 효과가있을 것입니다. 선택 (SELECT) 문자열을 구축과 같이 루프와 쉬운 것입니다 : 이것은 당신이 onPause 방법에 long[] savedRows에 원래 커서에서의 ROWID를 저장하는 것이 가정입니다

String selectQuery = ""; 
String[] selectArgs = new String[savedRows.length]; 
for (int i = 0; i < savedRows.length; i++){ 
    selectQuery = selectQuery.concat("rowID = ? OR "); 
    selectArgs[i] = Long.toString(savedRows[i]); 
} 

//Remove the last " OR " you'd have in the string 
int index = selectQuery.lastIndexOf(" OR "); 
selectQuery = selectQuery.substring(0, index); 

. 그런 다음 새 데이터베이스 쿼리에이를 전달할 수 있습니다. 덧글에 대한 너무 오래 다시


:

@Ryan : 좋은 지적, 그들은 다시 같은 순서로 뽑아되지 않을 수 있습니다. 실험 해 볼 수도 있지만 우연이든 디자인 상 언제나 같은 순서로 반환했는지 알기는 어려울 것입니다. 좋습니다. 아이디어 3 번은 20 개의 무작위 질문으로 채워진 중간 테이블을 만듭니다. 이 테이블에는 행 번호 (질문 순서를 제공)에 대한 열이 있고 질문 테이블에 질문의 rowId가있는 외래 키 열이 있습니다. 이 표에서 같은 순서로 질문을 검색하는 것은 쉬우 며 사용자가 모든 질문을 완료하면 표를 삭제할 수 있습니다. 또는 사용자가 이전 질문 세트에서 얼마나 잘 수행했는지 볼 수 있도록 테이블을 유지할 수도 있습니다.하지만 이는 완전히 다른 기능입니다.

참고 : 첫 번째 게시물에서도 onSaveInstanceState를 언급해야합니다. onPause는 활동을 변경하기 전에 빠른 저장을 수행하기에 좋은 장소이지만 int에 위치를 저장하는 것만으로는 결코 쉬운 일은 아닙니다. 분명히 사용자가 새 퀴즈를 시작하면 다시 설정되지만 사용자가 다른 활동을보고있는 동안 OS가 메모리 프로세스를 중단해야하는 경우 재설정됩니다. 이 경우 사용자가 작업으로 돌아 오면 onCreate에서 다시 시작해야하므로 가변 데이터가 손실됩니다. 이는 onSaveInstanceState() 메서드와 함께 작동하며 데이터를 저장할 수있는 번들을 제공합니다. 이 번들은 onCreate에서 제공되므로 필요한 모든 항목을 다시로드하여 앱이 죽지 않았던 것처럼 보일 수 있습니다.

+0

@ 스티브 H : 답변 해 주셔서 감사합니다. 제한 매개 변수를 받아들이는 SQLiteDatabase 클래스의 쿼리 메서드를 사용하여 실제로 커서를 채 웁니다. 나는 param에 의한 order를 위해 RANDOM()을, limit param에는 20을 건네 준다. 나는 커서 위치를 저장하는 것이 커서의 실제 행 순서를 저장하는 많은 좋은 승/팔을 할 수 있을지 잘 모르겠다. 따라서 커서 자체의 상태를 저장해야합니다. – Ryan

+0

@Steve H : 예, RANDOM()은 SQLite 데이터베이스의 표준 함수로 작동합니다. 이 쿼리 "SELECT * FROM SOME_TABLE ORDER BY RANDOM()"을 시도하십시오. 당신이 말하는 것을 보았습니다. 그러나 행이 원래 커서가 가져 오는 순서대로 반환되지 않으면이 경우에 도움이 될 것이라고 생각하지 않습니다. 20 개의 무작위 질문을 당긴 후 활동이 일시 중지/질문 5로 중지되었습니다. 활동을 다시 시작하고 행을 다시 가져 오면 행이 원래 위의 방법을 사용하는 것과 똑같은 순서로 끌어 당겨집니다? – Ryan

+1

@ 스티브 H : 저는 임시 테이블 아이디어를 정말 좋아합니다. 그러나 나는 휴대 전화의 방향이 변경되었을 때 나는 커서의 상태를 저장하는 것에 만 관심이 있다고 언급 했어야했다. onRetainNonConfigurationInstance()를 사용하여 참조하는 스택 오버플로에 대한 또 다른 게시물을 찾았지만 내 앱이 결국 임시 테이블 아이디어를 사용하도록 조정할 수는 있지만 결국 필요한 것처럼 작동합니다. 도움의 손길에 감사드립니다! – Ryan

관련 문제