Java 使用SharedReferences在android应用程序中保存字符串[][]数组

Java 使用SharedReferences在android应用程序中保存字符串[][]数组,java,android,sharedpreferences,Java,Android,Sharedpreferences,我已经阅读了这个主题的相关帖子,我无法解决我的问题。请看一下我的代码,让我知道问题出在哪里 我想在我的应用程序中创建一个字符串[10][2]数组,所以每当我的应用程序启动时,它都会检索这个数组并围绕它工作。该数组由用户名和对应于该用户名的密码组成。我想为新用户创建新密码,并检索已注册用户的密码 public class PasswordGeneration extends Activity { private static final String charSet = "0123456

我已经阅读了这个主题的相关帖子,我无法解决我的问题。请看一下我的代码,让我知道问题出在哪里

我想在我的应用程序中创建一个字符串[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;
    }
}
公共类密码生成扩展了活动{
私有静态最终字符串charSet=“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@$%^&*()u+=-/?”;
私有静态随机rnd=新随机();
私有字符串[][]globDataBase=新字符串[10][2];
私有字符串密码;
私有字符串温度;
图像按钮按钮背面;
文本视图设置过程;
字符串名,genePass;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.pass_结果);
buttonBack=(ImageButton)findViewById(R.id.widget54);
setPass=(TextView)findViewById(R.id.widget51);
Bundle Bundle=getIntent().getExtras();
name=bundle.getString(“name”);
name=“Amir”//对于测试,实际应用中应该省略这一行
globDataBase=loadDataBase(this);
genePass=密码生成(名称,12);
setPass.setText(genePass);
setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
完成();
}
});
}
公共字符串密码生成(字符串名称,int len){
对于(int i=0;i<10;i++){
if(globDataBase[i][0]==名称){
返回globDataBase[i][1];
}
}
StringBuilder sb=新StringBuilder(len);
对于(int j=0;j

当我运行我的应用程序时,我会得到username=“Amir”的密码,当我再次运行应用程序时,我希望得到相同的密码,但我会得到相同名称“Amir”的新密码。我无法找出问题所在。

您可能不知道如何使用键值容器。请参阅代码:

//it errors
editor.putString("dataBase", db[i][j]);
保存您的姓名和密码后

editor.putString("dataBase", "Amir");
editor.putString("dataBase", "Amirpwd");
您将获得“Amirpwd”

解决方案:

editor.putString("Amir", "Amirpwd");
您将获得正确的pwd

String pwd = prefs.getString("Amir", null)//it returns "Amirpwd"
for(int i=0;i<10;i++){
对于(int j=0;j<2;j++){
putString(“数据库”,db[i][j]);
}
}
这是错误的,因为您基本上是在循环和重写键“dataBase”的值

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

for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase["+i+"]["+j+"]", db[i][j]);
            }
        }
for(int i=0;i<10;i++){
对于(int j=0;j<2;j++){
putString(“数据库[“+i+”][“+j+”]”,db[i][j]);
}
}

因此,您将创建“数据库[0][1]”之类的条目,然后需要逻辑来检索它们。。。但是,在我看来,另一个好方法是将数组序列化为字符串(例如JSON字符串),并使用方法putString将其放入首选项

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


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

也许您应该使用SQLite来保存此数据?这是一种更好的存储数据数组的方法。我认为您每次都在覆盖内容-使用“dataBase_u“+i+”“+j作为键,而不是“dataBase”。首先感谢您的回答。我换了钥匙,一切正常。我使用相同的键来检索值。
for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase", db[i][j]);
            }
        }
for(int i = 0; i < 10; i++){
            for(int j = 0; j < 2; j++){
                editor.putString("dataBase["+i+"]["+j+"]", db[i][j]);
            }
        }