【问题标题】:Shared Preferences gets lost共享首选项丢失
【发布时间】:2012-11-17 22:14:14
【问题描述】:

我正在将 2 个字符串保存到共享首选项中,有时由于某种原因它们被删除了。 我知道在 stackoverflow 上还有其他几个问题,但没有一个对我有帮助..

我保存到共享首选项的方式有问题吗?

有没有人知道是什么导致了这个问题,它只发生了两次,比如 2 周之类的......所以我可以测试它,看看我是否已经解决了这个问题?

static void saveTitlePref(Context context, int mAppWidgetId, String text) {
    SharedPreferences.Editor editor = context.getSharedPreferences(PREFS_NAME, 0).edit();
    editor.putString(PREF_PREFIX_KEY + mAppWidgetId, text);
    editor.apply();
}

static void saveSizePref(Context context, int mAppWidgetId, String size) {
    SharedPreferences.Editor editor = context.getSharedPreferences(PREFS_NAME, 0).edit();
    editor.putString(PREF_SIZE_PREFIX_KEY, size);
    editor.apply();
}

我这样加载它们:

static String loadTitlePref(Context context, int mAppWidgetId) {

    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    String prefix = prefs.getString(PREF_PREFIX_KEY + mAppWidgetId, null);
    // If there is no preference saved, get the default from a resource
    if (prefix != null) {
        return prefix;
    } else {
        return context.getString(R.string.appwidget_prefix_default);
    }
}

static String loadSizePref(Context context, int mAppWidgetId) {

    SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    String sizeprefix = prefs.getString(PREF_SIZE_PREFIX_KEY, null);
    // If there is no preference saved, get the default from a resource
    if (sizeprefix != null) {
        return sizeprefix;
    } else {
        return "24";
    }
}

【问题讨论】:

  • 使用editor.commit();而不是editor.apply();
  • 这看起来不错,您是如何读取这些值的?
  • @MMohsinNaeem 胡。认为它几乎相同,但我会尝试它,看看它是否有效,谢谢..
  • @Jakob 你的if (sizeprefix != null) 检查是多余的,使用String sizeprefix = prefs.getString(PREF_SIZE_PREFIX_KEY, "24");
  • 哦!现在我想起来了,说 commit() 而不是 apply() 可能会解决问题,因为我查看了我的应用程序的早期版本,我认为它没有这个错误,并且在那个版本中我使用了 commit (),不记得为什么改了..

标签: android sharedpreferences


【解决方案1】:

您是使用多个进程还是单个进程?

您使用的是什么 API 级别?我知道在 API 级别 11 中,Google 更改了默认标志,因此 MODE_MULTI_PROCESS 不再是默认标志。只是一个想法。

【讨论】:

  • 我的最小 API 是 12。抱歉,我是初学者,您是指进程吗?
  • 好吧,那可能不是问题所在。您可以运行多个进程,但这并不典型——您必须在 AndroidManifest.xml 文件中明确设置它
【解决方案2】:

在您的情况下可能不是答案,但我遇到了类似的问题。它“消失”的原因是由于某种原因 String example = "notnull" 无法使用以下方法进行比较:

example != null;

这使它看起来像是消失了,但实际上并没有。如果您改为调用它:

example.equals(null);

它将能够识别它。我知道这与第一个相反,但你弄清楚了。这可能不是您的情况的答案,但您应该尝试一下。

【讨论】:

  • 现在 prefs 甚至没有被加载.. 只是为了确定:你的意思是我应该替换: if (prefix != null) { with: if (prefix.equals(null)) {
  • 是的,这有问题。我注意到您在代码中使用了第一个。那我帮不了你。你可以考虑在这个问题上设置一个赏金。
【解决方案3】:

我刚刚把editor.apply();改成了editor.commit();

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多