我已阅读本主题中的相关帖子,但无法解决我的问题。请查看我的代码,并告诉我问题所在。
我想在我的应用程序中创建一个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”。我无法弄清楚问题出在哪里。
答案 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类进行序列化。