:
위치가 클래스 필드 (즉, 일반적으로, 어떤 방법 이외의 선언은
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에서 제공되므로 필요한 모든 항목을 다시로드하여 앱이 죽지 않았던 것처럼 보일 수 있습니다.
@ 스티브 H : 답변 해 주셔서 감사합니다. 제한 매개 변수를 받아들이는 SQLiteDatabase 클래스의 쿼리 메서드를 사용하여 실제로 커서를 채 웁니다. 나는 param에 의한 order를 위해 RANDOM()을, limit param에는 20을 건네 준다. 나는 커서 위치를 저장하는 것이 커서의 실제 행 순서를 저장하는 많은 좋은 승/팔을 할 수 있을지 잘 모르겠다. 따라서 커서 자체의 상태를 저장해야합니다. – Ryan
@Steve H : 예, RANDOM()은 SQLite 데이터베이스의 표준 함수로 작동합니다. 이 쿼리 "SELECT * FROM SOME_TABLE ORDER BY RANDOM()"을 시도하십시오. 당신이 말하는 것을 보았습니다. 그러나 행이 원래 커서가 가져 오는 순서대로 반환되지 않으면이 경우에 도움이 될 것이라고 생각하지 않습니다. 20 개의 무작위 질문을 당긴 후 활동이 일시 중지/질문 5로 중지되었습니다. 활동을 다시 시작하고 행을 다시 가져 오면 행이 원래 위의 방법을 사용하는 것과 똑같은 순서로 끌어 당겨집니다? – Ryan
@ 스티브 H : 저는 임시 테이블 아이디어를 정말 좋아합니다. 그러나 나는 휴대 전화의 방향이 변경되었을 때 나는 커서의 상태를 저장하는 것에 만 관심이 있다고 언급 했어야했다. onRetainNonConfigurationInstance()를 사용하여 참조하는 스택 오버플로에 대한 또 다른 게시물을 찾았지만 내 앱이 결국 임시 테이블 아이디어를 사용하도록 조정할 수는 있지만 결국 필요한 것처럼 작동합니다. 도움의 손길에 감사드립니다! – Ryan