我正在尝试编写我的第一个程序,现在正在学习和编写通过SharedPreferences保存一般信息和用户信息的部分。
使用了这些文档,并编写了第一部分来保存一般信息,一切都很好。我能完美地书写和阅读价值观。
我扩展到在第二个文件中存储用户信息,它似乎是写的,但我总是得到默认值。如果我切换到使用一般信息文件而不是用户文件,它可以工作。
我认为我在使用GetSharedPreferences()时做错了什么,因为它限制我只使用一个文件,就像它对GetPreferences()说的那样。
我要存储在名为"Data“的文件中的一般设置,以及为每个用户保存在文件User1、User2等中的用户设置。
下面是我的密码。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// If first time running app, create Guest user
int intNumOfUsers=Integer.valueOf(funcReadData("Data","INT","NumOfUsers"));
if (intNumOfUsers==0)
{
String strTest=funcReadData("User1","STR","User");
subWriteData("Data","INT","NumOfUsers","1");
subWriteData("User1","STR","Name","Guest");
subWriteData("User1","STR","Pass","Guest");
}
// Determine if user needs to login before continuing
if (Boolean.valueOf(funcReadData("Data", "BLN", "StayLoggedIn")))
{
subLoadMain();
finish();
}
}在上面的onStart中,当应用程序第一次运行时,它从“数据”文件中读取intNumOfUsers的值,如果为0,则通过将intNUmOfUsers更改为1,然后创建一个来宾用户/传入"User1“文件来创建一个默认文件。
"Data“文件的值保存并可以完全读取,但是"User1”的值似乎没有保存,因为我只有在读取它时才得到默认值。
我使用下面的普通过程来读取和写入数据,因此在每种情况下都不存在代码差异的错误。
public void subWriteData(String strFile, String strType, String strKey, String strValue)
{
SharedPreferences prefs = getSharedPreferences(strFile, MODE_PRIVATE);
SharedPreferences.Editor editor=prefs.edit();
Log.d("WD","WRITE-"+strFile+"-"+strType+"-"+strKey+"-"+strValue);
switch (strType)
{
case "STR":
editor.putString(strKey, strValue);
break;
case "INT":
editor.putInt(strKey,Integer.valueOf(strValue));
break;
case "BLN":
editor.putBoolean(strKey,Boolean.valueOf(strValue));
break;
case "LNG":
editor.putLong(strKey,Long.valueOf(strValue));
break;
case "FLT":
editor.putFloat(strKey, Float.valueOf(strValue));
break;
}
editor.commit();
}
public String funcReadData(String strFile, String strType, String strKey) {
String strValue = "";
SharedPreferences prefs = getSharedPreferences("Data", MODE_PRIVATE);
switch (strType)
{
case "STR":
strValue = prefs.getString(strKey, "");
break;
case "INT":
strValue = String.valueOf(prefs.getInt(strKey, 0));
break;
case "BLN":
strValue = String.valueOf(prefs.getBoolean(strKey, false));
break;
case "LNG":
strValue = String.valueOf(prefs.getLong(strKey, 0));
break;
case "FLT":
strValue = String.valueOf(prefs.getFloat(strKey, 0));
break;
}
Log.d("WD","READ"+"-"+strFile+"-"+strType+"-"+strKey+"-"+strValue);
return strValue;
}下面是更多的代码,在这些代码中,我可以找到用户的详细信息,并与给定的信息匹配,或者创建新的用户等等。
public void subCreateLogin(View view)
{
Boolean boolUserFound=false;
Boolean boolUserLoggedIn=false;
int intNumOfUsers;
CheckBox chkStayLoggedIn = (CheckBox) findViewById(R.id.chkStayLoggedIn);
EditText txtUser = (EditText)findViewById(R.id.txtUser);
if (txtUser.getText().length()==0 )
{
Toast.makeText(Login.this, "Please enter a valid username", Toast.LENGTH_SHORT).show();
}
else
{
EditText txtPass = (EditText)findViewById(R.id.txtPass);
if (txtPass.getText().length()==0 )
{
Toast.makeText(Login.this, "Password field cannot be empty", Toast.LENGTH_SHORT).show();
}
else
{
intNumOfUsers=Integer.valueOf(funcReadData("Data","INT","NumOfUsers"));
if (intNumOfUsers>1)
{
int Lvar;
String txtData;
for (Lvar = 1; Lvar <= intNumOfUsers; Lvar++)
{
txtData = funcReadData(("User"+Lvar).toString(), "STR","Name");
if (txtData.toUpperCase().equals(txtUser.getText().toString().toUpperCase()))
{
boolUserFound=true;
txtData = funcReadData(("User"+Lvar).toString(), "STR", "Pass");
if (txtData.equals(txtPass.getText().toString()))
{
boolUserLoggedIn=true;
subWriteData("Data","STR","LastUser", txtUser.getText().toString());
if (chkStayLoggedIn.isChecked())
{
subWriteData("Data","BLN","StayLoggedIn","true");
}
}
else
{
Toast.makeText(Login.this, "Incorrect password. Please try again.", Toast.LENGTH_SHORT).show();
}
}
}
}
if (!boolUserFound)
{
// First new user, create his details
intNumOfUsers++;
subWriteData("Data","INT","NumOfUsers",String.valueOf(intNumOfUsers));
subWriteData(("User"+intNumOfUsers).toString(), "STR", "Name", txtUser.getText().toString());
subWriteData(("User"+intNumOfUsers).toString(),"STR","Pass",txtPass.getText().toString());
subWriteData("Data","STR","LastUser", txtUser.getText().toString());
//boolUserFound=true;
boolUserLoggedIn=true;
if (chkStayLoggedIn.isChecked())
{
subWriteData("Data","BLN","StayLoggedIn","true");
}
}
}
}
if (boolUserLoggedIn)
{
subLoadMain();
finish();
}
}所以,任何读/写到“数据”的东西都没问题,但是"User1“、"User2”等似乎都没有用。如何启用保存多个首选项文件的能力?
谢谢!
发布于 2016-01-08 14:17:44
在读取数据函数中,在获取共享prefs时,您已经将文件名指定为数据,而不是传递文件名,而在写入过程中使用传递的文件名。
https://stackoverflow.com/questions/34678433
复制相似问题