SharedPreferences在重新启动后不保存所有数据

时间:2016-10-22 03:58:42

标签: android listview sharedpreferences

我是Android App Development的新手,我应该为一门课程制作一个TodoList应用程序。但是我的代码中的SharedPreference不起作用。我不知道我是否应该以特定的方式在onCreate或onStop中使用它。

它保存用户永久输入的第一个输入,但位于相同的位置: enter image description here" task0" 是我用来跟踪我用作" putString" addStuff 方法,以避免替换值)

之后在同一会话中保存输入,但如果用户结束该会话,那么" t"之后的所有这些值消失了。如果用户重新启动应用程序并输入其他内容(例如" g"),则会保存" g"在同一个第三位。

我有基本的Java知识,我试图了解使用它的情况,但失败了。请告诉我错误的位置以及如何正确使用SharedPreferences。

public class TodoActivity extends AppCompatActivity {

public ArrayList<String> items;
public ArrayAdapter<String> itemsAdapter;
public ListView list;
public String s;
public EditText taskBox;
public static final String filename = "itemsList";
public TextView text;
public static int counter = 0;//counter starting at 0 no matter what, everytime the app starts
public String newtask= "task";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_todo);

    list = (ListView) findViewById(R.id.list1);text = (TextView) findViewById(R.id.text1);
    taskBox = (EditText) findViewById(R.id.box);
    s = taskBox.getText().toString();

    items = new ArrayList<String>();

    itemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
    list.setAdapter(itemsAdapter);

    //add items to list
    items.add("First Item");
    items.add("Second Item");

    //restore
    SharedPreferences sp = this.getSharedPreferences("itemsList", 0);

    //checking if it stores the previous values, this gives the last input but not the previous ones after restarting the app
    String dummyname = "task";
    text.setText(String.valueOf(counter));//since counter is again at
    for(int c=0; c<=50; c++){
        String num = String.valueOf(c);
        dummyname = dummyname + num;
        String x = sp.getString(dummyname, "not found");
        if (x.equalsIgnoreCase("not found")){
            counter=c-1;
            break;
        } else {
            items.add(x);
            text.setText(dummyname);
        }
    }

}

public void addItem(View v){
    s = taskBox.getText().toString();
    itemsAdapter.add(s);//adding the new task as string

    String temp = String.valueOf(counter);
    newtask = "task" + temp;

    //trying to store the new tasks with different variable names to avoid being replaced
    text.setText(newtask);
    SharedPreferences sp = this.getSharedPreferences("itemsList", 0);
    SharedPreferences.Editor e = sp.edit();
    e.putString(newtask,s);
    e.apply();

    counter++;
}

}

3 个答案:

答案 0 :(得分:1)

如果您要保存的键值集合相对较少, 您应该使用Shared preference API

从共享偏好中读取:

传递您要编写的密钥和值,通过调用SharedPreferences上的edit()创建SharedPreferences.Editor。

使用此方法 putInt() putString()传递要保存的键和值,然后调用 commit()保存更改。例如:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("KeyName", newHighScore);
editor.commit();

从共享偏好中写入:

要从共享首选项文件中检索值,请调用 getInt() getString()等方法, 提供所需值的键,以及可选的默认值(如果键不存在则返回)。例如:

SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt("KeyName", defaultValue);

答案 1 :(得分:0)

两件事:

1)要初始化SharedPreferences,请使用:

sharedPreferences = getSharedPreferences("itemsList", Context.MODE_PRIVATE);

2)你在哪里调用addItem()方法??

答案 2 :(得分:0)

问题在于您用于保存项目的标记。见本行:

Unexpected token '<'

您可以按以下格式添加项目:

dummyname = dummyname + num;

但您正在以此格式获取值

task0
task1
task2

只需更改这两行代码:

task0
task01
task012