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