尝试从共享首选项中检索数据时我遗漏了什么

What I missing when tried to retrieve data from Shared Preferences

嘿,伙计,看看我在这里遗漏了什么,因为我无法从共享首选项中获取我的所有数据。 我正在制作这样一个任务列表应用程序,我在其中使用某个键保存我的数据(意味着 mytask)并将其存储在共享首选项中并增加一个变量以获取总计数。

检查我的代码(每当我点击 addTask 按钮时,就会执行以下代码)。

private void saveToSharedPreference(){
    sharedPre = getSharedPreferences("todoPref",Context.MODE_PRIVATE);
    editor = sharedPre.edit();
    String myKey = "key"+a;
    String myValue = et.getText().toString();
    editor.putString(myKey,myValue);
//        editor.putInt("totalTask", a);
    editor.commit();
} 

现在,当我关闭应用程序并再次打开它时,将执行以下代码以从共享首选项加载数据。

private  void loadData(){
    sharedPre = getSharedPreferences("todoPref",Context.MODE_PRIVATE);
    int p = 1;
    String myKey = "key"+p;
    while(sharedPre.getString(myKey,"") != null){
        Toast.makeText(this, sharedPre.getString(myKey,""),Toast.LENGTH_SHORT).show();
    }
}

但问题是它总是在所有索引上返回 null。我不知道为什么会收到此错误。请帮我 提前致谢 萨罗什马达拉

这样做 -

1) 像这样保存在共享首选项中 -

private void saveToSharedPreference(){
    sharedPre = getSharedPreferences("todoPref",Context.MODE_PRIVATE);
    editor = sharedPre.edit();
    String myKey = "key";                        // removed +a
    String myValue = et.getText().toString();
    editor.putString(myKey,myValue);
//        editor.putInt("totalTask", a);
    editor.commit();
} 

2) 像这样加载 -

 private void loadData() {
       sharedPre = getSharedPreferences("todoPref",Context.MODE_PRIVATE);
       int p = 1;
       String myKey = "key";  // removed "+p"
        String value = sharedPre.getString(myKey, ""); 

    }

不要在 while 循环中与 != null 进行比较。使用下面的代码,看看问题是否解决:-

private  void loadData(){
    sharedPre = getSharedPreferences("todoPref",Context.MODE_PRIVATE);
    int p = 1;
    String myKey = "key"+p;
    String value = sharedPre.getString(myKey,""); 
    if(!value.equalsIgnoreCase("")){
        Toast.makeText(this, sharedPre.getString(myKey,""),Toast.LENGTH_SHORT).show();
    }
}

加载所有保存的值只需使用以下代码:

private void loadData() {
        SharedPreferences sharedPre = getSharedPreferences("todoPref",android.content.Context.MODE_PRIVATE);
        Map<String,?> keys = sharedPre.getAll();
        for(Map.Entry<String,?> entry : keys.entrySet()){
                if (entry.getValue().toString().length() > 0) {
                    Log.d("map values",entry.getKey() + ": " + entry.getValue().toString());     
                }
         }
    }

我找到了它 here 但添加了一个检查以忽略空值。

为了将值保存到共享首选项,我建议使用当前时间的实例作为密钥。无需保存任何整数键值:

private void saveToSharedPreference(String myValue){
        SharedPreferences sharedPre = getSharedPreferences("todoPref",android.content.Context.MODE_PRIVATE);
        Editor editor = sharedPre.edit();
        String key = String.valueOf(Calendar.getInstance().getTimeInMillis());
        editor.putString(key,myValue);
        editor.commit();
    } 

因此,无论何时您想向共享首选项添加值,请使用:

saveToSharedPreference("myValue");

并加载它们全部使用:

loadData();

地图界面

Map 是将键映射到值的对象。映射不能包含重复的键:每个键最多可以映射到一个值。 read more...

共享首选项:Class Overview