2011-05-10 3 views
7

내 앱은 간단한 설정을 SharedPreferences에 저장합니다. 그러나 다운로드 한 사람은 내 앱에 문제가 있습니다. SharedPreferences의 설정이 앱 종료 및 다시로드 사이에 없어졌습니다.SharedPreferences에 저장된 사용자 설정이 앱 리로드간에 제거되거나 손실되었습니다

휴대 전화에서 세션간에 데이터가 저장되는 것을 막는 권한 문제가있을 수 있습니까?

이 현상이 일어날 수있는 이유가 있었거나 경험이있는 사람이 있습니까? 디버깅하는 데 상당히 어려움을 겪고 있습니다. 어디서부터 시작해야할지 모르겠습니다.

// I'm using SharedPreferences Like so: 
prefs = getSharedPreferences(this.getString(R.string.prefs_name), 0); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString("accounts", accounts); 
editor.commit(); 

//retrieving stored information like: 
SharedPreferences prefs = getSharedPreferences(this.getString(R.string.prefs_name), 0); 
String accounts = prefs.getString("accounts","[]"); 
+0

defaultSharedPreferences를 사용하고 있습니까? 그렇지 않다면 사용하는 문자열 키가 사용간에 동일하다는 것을 확인 했습니까? 코드 스 니펫 (snippet) 없이는 무엇을 잘못하고 있는지 알기가 어렵습니다. –

+0

이봐, 아니 그냥 SharedPreferences, 나는 밖으로 동일한 열쇠를 사용하고, 애플 리케이션이 수천,이 한 사람을 위해 잘 작동합니다. 이 정보에 의존하는 나머지 앱은 앱을 종료 할 때까지 완벽하게 작동합니다. – Rob

+0

저장 공간 문제 일 수 있습니까? – OceanBlue

답변

6

Android 앱과 동일한 문제가 있습니다. 우리의 사용자 기반은 꽤 크고 (수백만 사용자) 통계에 따르면 약 0.2 % - 0,3 %의 사용자가 문제를 겪었습니다. 그다지 많지는 않지만 userbase를 사용하면 수천 명의 사용자가있는 것처럼 보입니다.

이 문제를 해결하기 위해 Google에서는 프로젝트에 대해 SharedPreferences의 사용을 중단했습니다. 우리는 대신 간단한 SQLiteDatabase을 사용하고 있으며 아주 잘 작동합니다.

+1

입력 해 주셔서 감사합니다. 나는 또한 내 애플 리케이션에서 SQLiteDatabase를 사용 해왔다. SharedPreferences를 신뢰할 수 없습니다. – Rob

+1

SharedPreferences의 문제를 설명하지는 못했지만 대답을 수락하면 SharedPreferences를 사용하여이 깨진 동작을 해결하는 유일한 합리적인 방법입니다. – Rob

8

동일한 문제가있었습니다. 다행히도 장치에 액세스 할 수 있었고 문제를 찾는데 도움이되었습니다. 우선, 로그 파일을 조사한 결과 오류가 발견되었습니다 :

W/SharedPreferencesImpl(31354): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string 

그래서 환경 설정 파일이 어떤 식 으로든 손상되었습니다. 내 응용 프로그램의 환경 설정 파일 세계적인 접근을 만들었습니다 :

SharedPreferences prefs = context.getSharedPreferences("main", Context.MODE_WORLD_READABLE); 

가 그럼 난 컴퓨터

adb pull data/data/my.package.name/shared_prefs/main.xml c:\main.xml 

에 장치에서 파일을 끌어와 환경 설정을 파일 내용 확인 :

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
<string>Paris,France</string> 
<string name="HideStatusBar">1</string> 

첫 번째 매개 변수를 "name"속성이 없습니다. 나는 코드를 검사하고 경우에 따라 첫 번째 매개 변수는 다음과 방식으로 기록 된 것을 발견했다 :

SharedPreferences.Editor e = _Prefs.edit(); 
e.putString(null, paramValue); 
e.commit()  

이름이 null했다. 나는 오류를 수정했고 문제는 사라졌다. 따라서 사소한 오류로 인해 환경 설정 파일이 완전히 손상 될 수 있습니다.

0

환경 설정 파일을 임시 저장, 삭제 및 다시 작성하는 업데이트를 앱에 보내야합니다.

나는 비슷한 상황이었습니다. 일부 사용자는 환경 설정 파일이 엉망이었을뿐만 아니라 SQL 데이터베이스도 가지고있었습니다. 사람들에게 삭제하고 다시 설치하도록 요청할 수는 없으므로 데이터가 손실 될 수 있습니다. 하지만 앱이 자동으로 먼저 백업하고 손상된 파일을 제거한 다음 다시 되돌릴 수 있습니다.

관련 문제