【发布时间】:2016-04-13 05:13:36
【问题描述】:
我正在尝试编写我的第一个程序,现在正在学习和编写通过 SharedPreferences 保存一般信息和用户信息的部分。
使用文档并编写了第一部分来保存一般信息,一切都很好。我可以完美地写入和读取值。
我扩展为将用户信息存储在第二个文件中,它似乎可以写入,但我总是得到默认值。如果我切换到使用一般信息文件而不是用户文件,它就可以工作。
我认为我在使用 GetSharedPreferences() 的方式上做错了,它限制我只使用 1 个文件,就像 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 创建一个默认值,然后创建一个访客用户/传入“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();
}
}
所以任何读/写“数据”的东西都很好,但对“用户1”、“用户2”等似乎永远都行不通。如何启用保存多个首选项文件的功能?
谢谢!
【问题讨论】: