android在数组或列表中存储值而不覆盖

android在数组或列表中存储值而不覆盖,android,arrays,database,list,sharedpreferences,Android,Arrays,Database,List,Sharedpreferences,我只是想知道是否有一种方法可以将数据保存到文本文件中而不被覆盖 目前我正在使用SharedReferences,它会覆盖数据,这是可以的,但与此同时,我希望在列表或列形式被覆盖之前,我可以在某个地方保留值的记录 所以是这样的: 60、65、70……等等 这些值一个接一个地存储,不会被覆盖。我正在考虑在本地以文本文件的形式执行此操作,该文本文件也可以读取 我这样做是为了创建一个统计页面或类似的东西 我希望有人能帮我找到解决办法 我的代码: public class workout extends

我只是想知道是否有一种方法可以将数据保存到文本文件中而不被覆盖

目前我正在使用SharedReferences,它会覆盖数据,这是可以的,但与此同时,我希望在列表或列形式被覆盖之前,我可以在某个地方保留值的记录

所以是这样的: 60、65、70……等等 这些值一个接一个地存储,不会被覆盖。我正在考虑在本地以文本文件的形式执行此操作,该文本文件也可以读取

我这样做是为了创建一个统计页面或类似的东西

我希望有人能帮我找到解决办法

我的代码:

public class workout extends Activity {

    TextView weightresultText, newweightresultText, difficultyrating;
    Boolean male, strength;
    double newweight, newweight1;
    int weight, age;
    Button button, button4;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.workout);
        button = (Button) findViewById(R.id.button);
        button4 = (Button) findViewById(R.id.button4);

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        weight = Integer.parseInt(sharedPreferences.getString("storedweight", "Your Weight"));
        age = Integer.parseInt(sharedPreferences.getString("storedage", "Your Age"));
        male = sharedPreferences.getBoolean("is_male", false);
        strength = sharedPreferences.getBoolean("is_strength", false);

        weightresultText = (TextView) findViewById(R.id.weightresultLabel);
        newweightresultText = (TextView) findViewById(R.id.newweightresultLabel);
        difficultyrating = (TextView) findViewById(R.id.difficultylevel);

         if (sharedPreferences.getBoolean("firstrun", true)) {AgeCalculation();

             sharedPreferences.edit().putBoolean("firstrun", false).commit();}


        AfterFirstLaunch();
    }

    public void SaveWeight(){
        savePreferences("storednewweight", (Double.toString(newweight)));
    }

//Should only happen on first launch.
    public void AgeCalculation() {
        if (strength == true){
        if (male == true && age >= 18) {
            newweight = (weight * 0.8);
            }
        if (male == true && age >= 30) {
            newweight = (weight * 0.6);
        }
        if (male == true && age >= 50) {
            newweight = (weight * 0.4);
        }
        if (male == true && age >= 70) {
            newweight = (weight * 0.2);
        }
        if (male == true && age > 80) {
            newweight = (weight * 0.1);
        }
        if (male == false && age >= 20 ){
            newweight = (weight * 0.3 );
                    }
        weightresultText.setText(Double.toString(newweight));
        SaveWeight();
            }}

    private void savePreferences(String key, String value) {
        SharedPreferences sharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

// On every other launch, it is based on button, the newweight is saved and loaded each time.
    public void buttonClick1(){
    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {

            //this gets the current weight based on first time launch.
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            String newweight =  sharedPreferences.getString("storednewweight", "");

           newweight1 = Double.parseDouble(newweight);

            newweight1 = newweight1 + 5;
            //saves value into sharedpreference
            savePreferences("storednewweight", (Double.toString(newweight1)));
            //save to shared preference, and load value on new launch?
            //also store into local database for review later.
            difficultyrating.setText("1");
            button.setEnabled(false);
            button4.setEnabled(false);

           //save this data then on new launch it uses this figure.
            // so first time it creates then uses this figure for future.
        }

    });}

    public void buttonClick4(){
        button4.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {

                //this gets the current weight based on first time launch.
                SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                String newweight =  sharedPreferences.getString("storednewweight", "");

                newweight1 = Double.parseDouble(newweight);

                newweight1 = newweight1 + 10;
                //saves value into sharedpreference
                //save to text file in array
                savePreferences("storednewweight", (Double.toString(newweight1)));

                difficultyrating.setText("2");
                button.setEnabled(false);
                button4.setEnabled(false);

                //save this data then on new launch it uses this figure.
                // so first time it creates then uses this figure for future.
            }

        });}

    //runs on every other launch
    public void AfterFirstLaunch(){

        buttonClick1();
        buttonClick4();
        //receive value on other launches and show on field.
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        String newweight =  sharedPreferences.getString("storednewweight", "");
        weightresultText.setText(newweight);

    }



        }

要写入覆盖的文本文件,请使用以下代码

File sdCard = Environment.getExternalStorageDirectory();
String path = sdCard.getAbsolutePath() + "/SO/";

File dir = new File(path);
    if (!dir.exists()) {
        if (dir.mkdirs()) {

    }
}

File logFile = new File(path + "filename.txt");
        if (!logFile.exists()) {
            logFile.createNewFile();
        }

        // BufferedWriter for performance, true to set append to file

        FileWriter fw = new FileWriter(logFile, true);
        BufferedWriter buf = new BufferedWriter(fw);


        buf.append("Message");
        buf.newLine();
        buf.flush();


        buf.close();
确保您在
AndroidManifest.xml中定义了权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


对于这样的情况,如果要存储多个类似数据项,您可能真的希望使用SQL数据库和内容提供商。您只需为每个条目创建新行。

那么,如果在我的代码中,按下按钮click 1并将值更改为50,而下一次按下按钮click 4并将值更改为60,文本文件中会显示为50、60吗?在SharedReference覆盖之前,我是否应该将您提供的代码放入它自己的类中,并在每个按钮中调用它?很抱歉问你,我花了这么多时间在这上面,不想弄错。你会得到50和60好的,我会试试看这是否是我想要的。所以你的代码,我到处都有错误,不知道为什么。未处理的异常:java.io.IOExceptionId您提供了
路径
您的文件夹路径吗?是的,我在想,但找不到任何好的教程来显示它,所以正在考虑文本文件的替代方案。数据库可以更好地工作,但不知道如何在我的代码中实现它。@Bimal你喜欢我分享一些关于SQLite的好教程吗?是的,我先尝试文本文件方式,然后再尝试sql方式,这样我对这两种方式都有了很好的了解。