【问题标题】:Retrieving SharedPreferences Data Failure检索 SharedPreferences 数据失败
【发布时间】:2014-04-16 19:31:27
【问题描述】:

我正在尝试使用 SharedPreferences,但一直遇到以下问题。

在我创建文件并向其中添加信息的类中,我执行以下操作:

private SharedPreferences prefs         = null;
private SharedPreferences.Editor editor = null;

public void setStuff (String info, boolean save, Context appCT) {
  if (prefs == null && editor == null) {
    prefs  = appCT.getSharedPreferences("preferences", Context.MODE_PRIVATE);
    editor = prefs.edit();
  }
  editor.putString("Custom", info);
  editor.commit();
}

据我所知,它运行良好。但是,当我尝试从另一个类访问我存储在“首选项”中的信息时:

private static SharedPreferences prefs = null;
private static String custom = null;

public static void getStuff(Context appCT) {
  if (prefs == null) {
    prefs = appCT.getSharedPreferences("preferences", Context.MODE_PRIVATE);
    custom = prefs.getString("Custom", null);
  }
}

custom 的值始终为 null,就好像我从未存储过 String。谁能告诉我这是为什么?

我已经找到了答案;我正在使用 getSharedPreferences 的上下文,我遵循了我找到的所有说明和教程,但结果没有变化。

注意:这些类不在同一个应用程序中。这是一个问题吗?我不能访问其他应用程序的首选项吗?

谢谢。

【问题讨论】:

  • 保存时确保“信息”不为空。确保它们在同一进程中。

标签: android sharedpreferences


【解决方案1】:

getStuff() 仅在 prefsnull 时设置 custom。因此,该方法在第一次被调用后什么也不做。或者,如果prefs 被设置之前这个方法被调用,那么这个方法将永远不会做任何事情。

该方法应如下所示:

public static void getStuff(Context appCT) {
  if (prefs == null) {
    prefs = appCT.getSharedPreferences("preferences", Context.MODE_PRIVATE);
  }
  custom = prefs.getString("Custom", null);
}

另外,如果 2 个类位于不同的应用程序中,Context.MODE_PRIVATE 将阻止它们共享 SharedPreferences。您可以改用 Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE,但这非常不安全,并且在 API 级别 17 中已弃用。请参阅上述链接中的信息以了解推荐的内容。

【讨论】:

  • 我这样做了,但我仍然每次都为空。我这样做的原因是因为我只需要它工作一次,这是我第一次知道首选项将为空。调试时,我看到 prefs 在 mFile 选项卡下显示了一个文件,该文件是正确文件的位置,但是在检索该值时它失败了。
  • 我假设:(1) 这两个类在同一个应用程序中,(2) 你在调用 setStuff() before getStuff(),以及 (3) 你将非空“信息”字符串传递给 setStuff()?
  • 回复您的优点:(1)它们实际上不在同一个应用程序中。有没有办法从另一个应用程序访问保存的首选项? (2) 这不是一个真正的问题,因为文件中总会有一些东西可以检索。 (3) 是的,我添加了签入,但它永远不会为空。
  • 查看我的更新答案。您可能应该使用不同的机制(ContentProvider 或 BroadcastReceiver)。
【解决方案2】:

我认为你需要做一个 prefs = PreferenceManager.getDefaultSharedPreferences(yourcontext);首先。

【讨论】:

  • 我不确定你的意思。我尝试使用它而不是当前的首选项分配,我仍然得到空值。在 if 语句之外使用它对我没有帮助,并且消除 if 语句会导致两个首选项分配,这对我来说似乎很愚蠢。我想我没明白你的意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多