共享首选项不会用相同的密钥覆盖吗?

时间:2019-04-18 20:33:00

标签: java android sharedpreferences

我有一个应用程序,登录后将用户的名称和姓氏存储在“共享首选项”中。它向我显示Toast消息,该消息设置为显示登录用户的名称和姓氏。

奇怪的是,它可能不会覆盖那些“首选项”中的数据,因为该应用程序显示了所有较早登录的用户,而更奇怪的是,它在另一个Activity运行期间(而不是在设置Toast的情况下)显示了Toast。当我手动更改一些Firebase数据库时。

我想知道这个userGuestID ... Android Studio给了我一个错误,说我应该做这个最终结果,因为从内部类内部访问变量userGuestID并需要将其声明为final。这会引起问题吗?

private static final String SHARED_PREFS = "sharedPrefs";
    private static final String USER_FIREBASE_URL = "userFirebaseURL";
    private static final String USER_GUEST_ID = "userGuestID";

用于保存用户数据的活动。

public void saveUserData(){

        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,0);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(USER_FIREBASE_URL,"here I provide the URL to Firebase Database node");
        editor.putInt(USER_GUEST_ID,guestNumber);
        editor.apply();
    }

这就是我加载数据的方式

public void loadData(){
        SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS,0);
        String userDataFirebaseURL = sharedPreferences.getString(USER_FIREBASE_URL,"");
        final int userGuestID = sharedPreferences.getInt(USER_GUEST_ID,0);
        try{
            databaseReference = FirebaseDatabase.getInstance().getReferenceFromUrl(userDataFirebaseURL);
        }catch (Exception e) {
        }

在这里创建Toast消息。

 databaseReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    Guest user;
                    try {
                        user = dataSnapshot.child("Guest" + userGuestID).getValue(Guest.class);
                        Toast.makeText(getApplicationContext(), user.getName() + " " + user.getSurname(), Toast.LENGTH_SHORT).show();
                    } catch (NullPointerException e) {

                    }

1 个答案:

答案 0 :(得分:0)

我还使用共享首选项将用户数据存储在设备中,如果可以帮助您,请尝试以下操作:-

AppPreference类:-

public class AppPrefrences {

    private static SharedPreferences mPrefs;
    private static SharedPreferences.Editor mPrefsEditor;

public static String getUserName(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getString("name", "");
    }

    public static void setUserName(Context ctx, String value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putString("name", value);
        mPrefsEditor.commit();
    }

public static String getUserSurName(Context ctx) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        return mPrefs.getString("surname", "");
    }

    public static void setUserSurName(Context ctx, String value) {
        mPrefs = PreferenceManager.getDefaultSharedPreferences(ctx);
        mPrefsEditor = mPrefs.edit();
        mPrefsEditor.putString("surname", value);
        mPrefsEditor.commit();
    }

}

现在像这样在项目中的任何位置设置用户名和姓氏:-

AppPreference.setUserName(YourActvity.class, "User Name");
AppPreference.setUserSurName(YourActvity.class, "User Surname");

并获得以下这些值:-

AppPreference.getUserName(YourActivity.class);
AppPreference.getUserSurName(YourActivity.class);