【问题标题】:SharedPreferences with multiple filesSharedPreferences 与多个文件
【发布时间】: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”等似乎永远都行不通。如何启用保存多个首选项文件的功能?

谢谢!

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    在获取共享首选项时,在读取数据函数中,您已将文件名指定为 Data,而不是在写入时使用传入的文件名传递文件名。

    【讨论】:

    • 哇,我现在觉得自己很愚蠢。感谢您帮助我发现这个愚蠢的错误。
    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 2019-06-05
    • 2011-08-22
    相关资源
    最近更新 更多