应用程序重新启动后,SharedPreference不会存储数据

时间:2017-12-12 12:58:17

标签: java android sharedpreferences

public class CityPreference{
SharedPreferences prefs;

public CityPreference(Activity activity) {
    prefs = activity.getPreferences(Activity.MODE_PRIVATE);
}
public String getCity(){
    String defaultStr = "Helsinki,FI";
    return prefs.getString("city", defaultStr);
}

public void setCity(String city){
    prefs.edit().putString("city", city).commit();
}
}

MainActivity:

   CityPreference cityprefs = new CityPreference(MainActivity.this);
    renderWeatherData(cityprefs.getCity());

我如何更改字符串:

 private void showInputDialog(){
    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
    builder.setTitle(getResources().getString(R.string.change_city));

    final EditText cityInput = new EditText(MainActivity.this);
    cityInput.setInputType(InputType.TYPE_CLASS_TEXT);
    cityInput.setHint("Helsinki,FI");
    builder.setView(cityInput);
    builder.setPositiveButton(getResources().getString(R.string.submitBtn), new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            CityPreference cityPref = new CityPreference(MainActivity.this);
            cityPref.setCity(cityInput.getText().toString());

            String newCity = cityPref.getCity();
            renderWeatherData(newCity);
        }
    });
    builder.show();
}

所以,我想做的是,每当我重新启动应用程序时。它总是会放

defaultStr to prefs.getString();

我应该清除数据存储吗?还是有更好的方法吗? 谢谢你的帮助!

4 个答案:

答案 0 :(得分:0)

初始化SharedPreference是错误的,使用getPreference()代替SharedPreference,同时提供SharedPreferences sharedPref = getSharedPreferences("PreferenceFile", Context.MODE_PRIVATE); 的名称。

试试这个

Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection timed out in

答案 1 :(得分:0)

如果您希望每次应用启动时都使用默认城市值,请不要使用共享偏好设置。在MainActivity中为城市使用loacal变量。

答案 2 :(得分:0)

使用命名文件:

<div id="leftSidebarAssistant">
  <svg id="leftSidebarAssistantOuterCircle" xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 34 34">
    <circle cx="16" cy="16" r="15.9155" class="progress-bar__background" />
    <circle cx="16" cy="16" r="15.9155" class="progress-bar__progress js-progress-bar" />
  </svg>
  <svg id="leftSidebarAssistantInnerCircle" xmlns="http://www.w3.org/2000/svg" viewBox="-1 -1 34 34">
    <circle cx="16" cy="16" r="15.9155" class="progress-bar__background" />
    <circle cx="16" cy="16" r="15.9155" class="progress-bar__progress js-progress-bar" />
  </svg>
</div>


#leftSidebarAssistant {
  width: 280px;
  text-align: center; 
  padding: 15px;
  border-bottom: 1px solid #E6E6E6;
  background-color: #fff;
}

#leftSidebarAssistantOuterCircle {
  height: 210px;
  width: 210px;
  transform: rotate(-90deg);
}

#leftSidebarAssistantInnerCircle {
  height: 170px;
  width: 170px;
  transform: rotate(-90deg);
  position: absolute;
  left: 78px;
  top: 43px;
}

.progress-bar__background {
  fill: none;
  stroke: #D3DCE9;
  stroke-width: 2px;
}

.progress-bar__progress {
  fill: none;
  stroke: #D3DCE9;
  stroke: #EF2B2B;
  stroke-dasharray: 100 100;
  stroke-dashoffset: 100;
  stroke-linecap: round;
  stroke-width: 2px;
  -webkit-transition: stroke-dashoffset 1s ease-in-out;
  transition: stroke-dashoffset 1s ease-in-out;
}




var percentageComplete = 0.5;
  var strokeDashOffsetValue = 100 - (percentageComplete * 100);
  var progressBar = $(".js-progress-bar");
  progressBar.css("stroke-dashoffset", strokeDashOffsetValue);

或使用默认文件:

SharedPreferences pref = getSharedPreferences("filename", MODE_PRIVATE);

答案 3 :(得分:0)

除了其他用户所说的内容(例如参见@KulsDroid),无论您如何阅读和初始化您的偏好设置,都应该通过向您的自定义Application类添加自定义Application类来更改应用程序的启动方式项目

onCreate()类有一个覆盖名为CityPreferences.setCity(myDefaultCity)的方法,您可以使用该方法在应用加载时以及在用户能够进行交互之前执行有用的操作。因此,在您的特定情况下,您应该在onCreate()方法中调用类似Map = #{foo => #{bar => 1, foo => #{bar => 2}}}. Map2 = maps:keyreplace(bar, foo, Map). >>> #{foo => #{foo => 1, foo => #{foo => 2}}} 的内容。

您可以找到官方文档here和一些相关的SO答案herehere

另外this是一个很好的教程,可以用来学习如何构建自己的Application类。