Сохранить загрузку SharedPreferences не работает на Gingerbread. Идеи?

Итак, у меня есть реализация общего класса SharedPreferences, который сериализует некоторый текст и сохраняет его в поле SharedPreferences String. Он отлично работает на моем устройстве HTC One M8 под управлением Android 4.4.2. Однако, когда я тестирую его на своем Samsung Galaxy S1, работающем с рутированным Gingerbread (2.2), он всегда возвращает "ноль" при чтении строки. Есть идеи, что может быть не так?

Если я пытаюсь загрузить сразу после сохранения (в том же процессе), он возвращает строку. Только когда я убиваю процесс и перезапускаю, он исчезает. Примечание: перезапустить с устройства. Не перекомпилировать / повторно развернуть. Weird.

Код:

import android.content.Context;
import android.content.SharedPreferences;
import com.myapp.Container.

/**
 */
public class SharedPrefsSavable {
    private final static String PrefsKey = "com.myapp";
    public static <T> T load(Class type, Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PrefsKey, Context.MODE_PRIVATE);
        T userData = null;
        try {
            String key = getPreferencesId(type);
            String stringData = prefs.getString(key, null);
            if (stringData != null) {
                userData = (T) Container.Serializer.deserialize(type, stringData);
            }
        }
        catch (Exception ex)
        {
            Container.Log.w("Unable to deserialize " + type + ": " + ex.getMessage());
        }
        if (userData == null) {
            try {
                userData = (T) type.newInstance();
            }
            catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
        return userData;
    }

    public void save(Context context) {
        SharedPreferences prefs = context.getSharedPreferences(PrefsKey, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        String asString = Container.Serializer.serialize(this);
        String objectKey = getPreferencesId();
        editor.putString(objectKey, asString);
        editor.commit();
    }

    private static String getPreferencesId(Class<? extends SharedPrefsSavable> type) {
        return type.getName();
    }

    public String getPreferencesId() {
        return SharedPrefsSavable.getPreferencesId(this.getClass());
    }

}

2 ответа

Решение

Красная сельдь - это была проблема, характерная для моего устройства, у которого было какое-то поврежденное состояние из-за того, что несколько переустановок не прошли должным образом. Оставьте этот ответ здесь на случай, если другие столкнутся с той же проблемой.

В основном я следил за файлом в

/dbdata/databases/com.myapp/shared_prefs/com.myapp_preferences.xml

Я заметил, что это никогда не менялось. Я удалил приложение и удалил /dbdata/databases/com.myapp полностью, а затем переустановил. Файлы были воссозданы, и на этот раз это сработало. Поэтому я предполагаю, что из предыдущей установки были устаревшие файлы / папки, которые мое приложение не имело права изменять.

Попробуй это,

        SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences( context);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString( "Key", "value" );

        // retrive 

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( context);
        String value = prefs.getString("key","default" );
Другие вопросы по тегам