首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多文件SharedPreferences

多文件SharedPreferences
EN

Stack Overflow用户
提问于 2016-01-08 13:38:37
回答 1查看 180关注 0票数 0

我正在尝试编写我的第一个程序,现在正在学习和编写通过SharedPreferences保存一般信息和用户信息的部分。

使用了这些文档,并编写了第一部分来保存一般信息,一切都很好。我能完美地书写和阅读价值观。

我扩展到在第二个文件中存储用户信息,它似乎是写的,但我总是得到默认值。如果我切换到使用一般信息文件而不是用户文件,它可以工作。

我认为我在使用GetSharedPreferences()时做错了什么,因为它限制我只使用一个文件,就像它对GetPreferences()说的那样。

我要存储在名为"Data“的文件中的一般设置,以及为每个用户保存在文件User1、User2等中的用户设置。

下面是我的密码。

代码语言:javascript
复制
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”的值似乎没有保存,因为我只有在读取它时才得到默认值。

我使用下面的普通过程来读取和写入数据,因此在每种情况下都不存在代码差异的错误。

代码语言:javascript
复制
 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;
    }

下面是更多的代码,在这些代码中,我可以找到用户的详细信息,并与给定的信息匹配,或者创建新的用户等等。

代码语言:javascript
复制
    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”等似乎都没有用。如何启用保存多个首选项文件的能力?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-08 14:17:44

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34678433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档