2013-08-27 40 views
3

我使用SharedPreferences,有时我在logcat中得到了这样的警告:SharedPreferences奇怪的警告

08-27 11:46:55.453: W/SharedPreferencesImpl(21824): getSharedPreferences 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:568) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:821) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:755) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:494) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:113) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:48) 
08-27 11:46:55.453: W/SharedPreferencesImpl(21824):  at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:87) 

它正在大多数情况下,但有时测试人员说,他们得到了与它的问题。有时候加载回来根本不起作用。 这是我SharedPreffer类:

public class SharedPreffer { 

    String PREF_FILE_NAME = "saveFile"; 

    public SharedPreffer(Context context) { 
     this.context = context; 
    } 

    Context context; 
    public static final String DEFAULT_VALUE = ""; 

    public void savePreferences(String key, int value) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(
       PREF_FILE_NAME, 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, Integer.toString(value)); 
     editor.commit(); 
    } 

    public void savePreferences(String key, String value) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(
       PREF_FILE_NAME, 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, value); 
     editor.commit(); 
    } 

    public void savePreferences(String key, Boolean value) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(
       PREF_FILE_NAME, 0); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putString(key, Boolean.toString(value)); 
     editor.commit(); 
    } 


    public String loadPreferences(String key) { 
     SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_FILE_NAME, 0); 

     return sharedPreferences.getString(key, DEFAULT_VALUE); 

    } 

} 

任何人都可以通过我这个有什么秘诀?

+1

'有时他们遇到问题'是一个非常好的问题描述。你能否详细说明一下? –

+1

也许您正在尝试编写空名称“Map name without name attribute” –

+0

您是否检查了这两个链接http://stackoverflow.com/questions/5368442/android-getsharedpreferences-error-map-value-without- name-attribute-boolean和http://stackoverflow.com/questions/11601109/trouble-with-sharedpreferences-conflicting-during-app-operation-and-then-disappe – surhidamatya

回答

3

Map value without name attribute: string表明您的String key为空或空。

入住的你的方法,如果事情是错抛出异常年初那种情况下,你会从你在哪里传递这样的无效键看到:

if (key == null || key.equals("")) throw new IllegalArgumentException("Key can't be null or empty string"); 
+0

而如果我想定义如何使用“”空字符串默认加载回来?当根本没有储值时。 –

+0

@AdamVarhegyi这很好,因为价值可以是“”。密钥不能。 –

0

我得到了同样的警告多次。

每当我使用共享偏好。后来我注意到,只要应用程序崩溃,任何运行时异常都会显示此警告。然后重新启动先前的活动使用共享首选项获取首选项值。然后我Googled它,并得到这个结果从这个SO Question