使用SharedPreferences在Android应用程序中保存String [] []数组

时间:2014-06-18 08:35:57

标签: java android sharedpreferences

我已阅读本主题中的相关帖子,但无法解决我的问题。请查看我的代码,并告诉我问题所在。

我想在我的应用程序中创建一个String [10] [2]数组,所以每当我的应用程序启动时,它都会检索这个数组并解决它。该数组由用户名和与该用户名对应的密码组成。我想为新用户创建新密码并检索已注册用户的密码。

public class PasswordGeneration extends Activity {

    private static final String charSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-/?";
    private static Random rnd = new Random();
    private String[][] globDataBase = new String[10][2];
    private String password;
    private String temp;
    ImageButton buttonBack;
    TextView setPass;
    String name,genePass;





    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.pass_result);
        buttonBack=(ImageButton)findViewById(R.id.widget54);
        setPass = (TextView)findViewById(R.id.widget51);

        Bundle bundle = getIntent().getExtras();
        name=bundle.getString("name");
        name = "Amir";//for testing, this line should be omitted for real application
        globDataBase = loadDataBase(this);
        genePass = passwordGeneration(name, 12);
        setPass.setText(genePass);


        buttonBack.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                finish();

            }
        });


    }



    public String passwordGeneration(String name, int len) {

        for(int i = 0; i < 10; i++){
            if(globDataBase[i][0] == name){
                return globDataBase[i][1];

            }

        }
                StringBuilder sb = new StringBuilder(len);
                for(int j = 0; j < len; j++ )
                sb.append(charSet.charAt(rnd.nextInt(charSet.length())));
                password =  sb.toString();
                setDataBase(name, password);
                return password;
    }

    public void setDataBase(String name, String password){

        for (int i = 0; i < 10; i++){
            if(globDataBase[i][0] == null){
                globDataBase[i][0] = name;
                globDataBase[i][1] = password;
                break;
            }
        }
        saveDataBase(globDataBase, this);
        return;

    }

    public boolean saveDataBase(String[][] db, Context mContext){
        SharedPreferences prefs = mContext.getSharedPreferences("dataBase", 0);
        Editor editor = prefs.edit();
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase", db[i][j]);
            }
        }
        return editor.commit();
    }

    public String[][] loadDataBase(Context mContext){
        SharedPreferences prefs = mContext.getSharedPreferences("dataBase", 0);
        String[][] dataBase = new String[10][2];
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
            dataBase[i][j] = prefs.getString("dataBase", null);
            }
        }
        return dataBase;
    }
}

当我运行我的应用程序时,我获得了username =“Amir”的密码,当我再次运行应用程序时,我希望得到相同的密码,但我得到一个新的同名“Amir”。我无法弄清楚问题出在哪里。

3 个答案:

答案 0 :(得分:1)

for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase", db[i][j]);
            }
        }

这是错误的,因为您基本上是循环并覆盖键&#34; dataBase&#34;的值。

我建议你找另一种保存数据的方法。如果您仍想使用共享首选项,最终可能会为每个元素创建几个键:

for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase["+i+"]["+j+"]", db[i][j]);
            }
        }

所以你将创建像&#34; dataBase [0] [1]&#34;然后你需要逻辑来检索它们......但同样,对我来说看起来像是一个不是最优的解决方案

答案 1 :(得分:0)

看起来你可能不知道如何使用键值容器。参见代码blew:

//it errors
editor.putString("dataBase", db[i][j]);

保存您的姓名和密码后

editor.putString("dataBase", "Amir");
editor.putString("dataBase", "Amirpwd");

你会得到“Amirpwd”

prefs.getString("dataBase", null)//it returns "Amirpwd"

<强>解决方案:

editor.putString("Amir", "Amirpwd");

你会得到正确的密码

String pwd = prefs.getString("Amir", null)//it returns "Amirpwd"

答案 2 :(得分:0)

另一个好方法是将数组序列化为字符串(例如,使用JSON字符串),并使用方法putString将其放入首选项。

当您需要获取它时,您可以反序列化序列化字符串。

您可以使用JSONArray类进行序列化。