【问题标题】:Storing a 1D array of strings in Shared Preferences在共享首选项中存储一维字符串数组
【发布时间】:2018-11-15 15:14:36
【问题描述】:

我有两个数组,第一个由 9 个按钮组成。第二个可以容纳 9 个字符串。我有一个名为 getPlayerChoiceText 的方法,用于使用 playerchoice 数组中每个按钮上设置的文本填充字符串数组。如何使用 SharedPreferences 保存此文本?

private String[] getPlayerChoiceText()
{
    playerchoiceText[0] = playerchoice[0].getText().toString();
    playerchoiceText[1] = playerchoice[1].getText().toString();
    playerchoiceText[2] = playerchoice[2].getText().toString();
    playerchoiceText[3] = playerchoice[3].getText().toString();
    playerchoiceText[4] = playerchoice[4].getText().toString();
    playerchoiceText[5] = playerchoice[5].getText().toString();
    playerchoiceText[6] = playerchoice[6].getText().toString();
    playerchoiceText[7] = playerchoice[7].getText().toString();
    playerchoiceText[8] = playerchoice[8].getText().toString();

    return playerchoiceText;
}

   private void saveData()
   {
      SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      playerchoiceText = getPlayerChoiceText();
   }

【问题讨论】:

  • 为什么要为此维护两个数组?你不能用Map<Button, String>吗?我认为SharedPreferences 正在存储键值对,这与Map 配合得很好。
  • 如果必须是SharedPreferences,请将您的字符串数组连接成一个长String,并在它们之间使用分隔符(例如:)。

标签: java android


【解决方案1】:

我也遇到了同样的问题。我通过使用JSONArray 解决了它。

JSONArray choices = new JSONArray();
choices.put("1");
choices.put("2");
choices.put("3");

// Save
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("choices", choices.toString());

// Retrieve
choices = new JSONArray(sharedPreferences.getString("choices", "[]"));

通过这种方式,您可以轻松进行InsertDelete 操作。我希望这会有所帮助。

【讨论】:

  • 好建议+1。我没想到。
【解决方案2】:

Android 的SharedPreferences 用作键值存储,不允许您直接存储Java 对象。因此,如果您想使用共享偏好存储它们,将您的玩家选择文本值表示为地图会更有意义。

如果您想继续将您选择的文本表示为一个数组,您可以在这里使用一个技巧。您可以使用分隔符存储文本,例如管道:

String choices = String.join("|", playerchoiceText);
SharedPreferences prefs = getSharedPreferences(YOUR_PREFS_KEY, Context.MODE_PRIVATE);
prefs.edit().putString("choices", choices).apply();

然后,在出去的路上:

SharedPreferences prefs = getSharedPreferences(YOUR_PREFS_KEY, Context.MODE_PRIVATE);
String[] playerchoiceText = prefs.getString("choices", "").split("\\|");

【讨论】:

  • 如果我使用列表会做得更好吗?而不是常规的一维数组?
  • 问题仍然存在,即共享首选项使用地图功能来存储其数据。因此,您需要适应地图界面。
【解决方案3】:

使用put/getStringSet():

private void saveData()
   {
      SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
      SharedPreferences.Editor editor = sharedPreferences.edit();
      String[] playerchoiceText = getPlayerChoiceText();
      editor.putStringSet("player_choice", new HashSet<T>(Arrays.asList(playerchoiceText)); 
      editor.commit();
   }

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2015-09-03
    • 2021-12-16
    相关资源
    最近更新 更多