我正在尝试编写我的第一个程序,现在正在学习和编写通过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中,当应用程序第一次运行时,它从“Data”文件读取以获取intNumOfUsers的值,如果为0,则通过将intNUmOfUsers更改为1来创建默认值,然后创建guest虚拟机User /传入“User1”文件。
“数据”文件的值保存并且可以完美读取,但“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”等似乎永远不会起作用。如何启用保存多个首选项文件的功能?
谢谢!
答案 0 :(得分:1)
在获取共享首选项时,在读取数据函数中,您已将文件名指定为“数据”,而不是在写入时传入文件名,而是使用传入的文件名。