Стойност на картата без атрибут име: низ

Използвал съм sharedpreference в моето приложение и проблемът е, когато принудително затворя или премахна приложение от скорошно приложение и го отворя отново, това ми дава изключение, казвайки Map Value without name attribute и стойността на предпочитанието се нулира.

Потърсих този проблем над stackoverflow и намерих някои от подобни въпроси като това и това.

след като проследих тези въпроси, се опитах да възпроизведа проблема в емулатора, но там не ми даде никакво изключение или нулиране на предпочитания xml. Извадих xml файл чрез DDMS от папката с данни на емулатора и всичко там изглежда добре. всяка стойност имаше непразно име на ключ.

Изключение на Logcat при работа на реално устройство:

03-17 14:59:55.099: W/SharedPreferencesImpl(8636): getSharedPreferences
03-17 14:59:55.099: W/SharedPreferencesImpl(8636): org.xmlpull.v1.XmlPullParserException: Map value without name attribute: string
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at com.android.internal.util.XmlUtils.readThisMapXml(XmlUtils.java:568)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at com.android.internal.util.XmlUtils.readThisValueXml(XmlUtils.java:821)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at com.android.internal.util.XmlUtils.readValueXml(XmlUtils.java:755)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at com.android.internal.util.XmlUtils.readMapXml(XmlUtils.java:494)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at android.app.SharedPreferencesImpl.loadFromDiskLocked(SharedPreferencesImpl.java:113)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at android.app.SharedPreferencesImpl.access$000(SharedPreferencesImpl.java:48)
03-17 14:59:55.099: W/SharedPreferencesImpl(8636):  at android.app.SharedPreferencesImpl$1.run(SharedPreferencesImpl.java:87)

Ето какво искам да попитам:

  1. Има ли някакъв проблем в кода или проблем в мобилното устройство?

    shared = getSharedPreferences(PreferenceHandler.PREFS,Context.MODE_PRIVATE);
    Log.i(TAG,"preference object created");
    last = shared.getInt(PreferenceHandler.LASTACTIVITY,PreferenceHandler.DEFAULTINT);
    
  2. Ако проблемът е в моето устройство, какво трябва да направя, за да го коригирам?


person user2376920    schedule 19.03.2014    source източник
comment
Правите ли commit() промените всеки път? Или поне във вашия onPause().   -  person Simon    schedule 19.03.2014
comment
да Ангажирам го в края на метода, в който поставям стойности в sharedPreference. същият код работи и в емулатора. Преди принудително затваряне проверявам предпочитания xml файл на емулатора и той е съхранил стойността. Също така, ангажирането наистина ли води до този проблем? ако двойката ключ-стойност не е съхранена, тя ще върне стойността по подразбиране, но в моя случай се казва, че атрибутът на име е null, което проверих в журнала и не е null.   -  person user2376920    schedule 20.03.2014
comment
Прав си, просто се чудех дали може да има някакво кеширане, водещо до повреден файл, но ако сте прегледали XML, това не е така. Това е странно. Ако намерите отговор, моля, върнете се, за да го публикувате.   -  person Simon    schedule 20.03.2014


Отговори (1)


Отговарям на собствения си въпрос за тези, които имат подобен проблем.

Премахвах елементи от списъка и поддържах състоянието на елементите от списъка в sharedpreference. Имам случай на превключване, който има случай по подразбиране, когато задавах стойност на ключ на нула. и тъй като моята логика на цикъла for беше грешна, открих, че със сигурност ще влезе в регистър по подразбиране веднъж, ако премахна някой елемент.

    switch (i + 1) {

    case 0:
        pref_1 = PreferenceHandler.constantA1;
        pref_2 = PreferenceHandler.constantB1;
        pref_3 = PreferenceHandler.constantC1;
        break;

    case 1:
        pref_1 = PreferenceHandler.constantA2;
        pref_2 = PreferenceHandler.constantB2;
        pref_3 = PreferenceHandler.constantC2;
        break;


    case default:
        pref_1 =null;
        pref_2 = null;
        pref_3 = null;
        break;

След като отстраня грешки в логиката на for цикъла и премахна случая по подразбиране, за да съм сигурен, че няма да се използва нулев ключ в sharedpreference и да получа изключение, ако моята логика на for цикъл все още е грешна. и сега работи добре.

Така че, ако някой получи подобен тип изключение и не може да разбере къде използва нулев ключ, опитайте се да разберете коя е стъпката, след която той предизвиква изключение и след това го проверете.

НАДЯВАМ СЕ ЩЕ ПОМОГНЕ НА НЯКОЙ!!! :)

person user2376920    schedule 21.03.2014
comment
Трябваше да прочета toastdroid.com/2014 /07/04/ преди да разбере какво става. - person CodeReaper; 15.09.2014