当前位置:  开发笔记 > Android > 正文

SharedPreferences总是在我现有的应用程序中获得默认值,但是在创建新应用程序时它就可以了

如何解决《SharedPreferences总是在我现有的应用程序中获得默认值,但是在创建新应用程序时它就可以了》经验,为你挑选了2个好方法。

SharedPreferences在一个现有应用中无法正常工作.我尝试了很多不同的方法,但仍然没有工作.始终获取默认值app start.

当我在创建的新应用程序中使用相同的代码时,它正在工作.

它正在运行所有其他现有应用程序.

你知道为什么吗?

    String default_user = "Default_User";
    SharedPreferences pref = this.getSharedPreferences("TEST_SHAREDPREF", MODE_PRIVATE);
    String user = pref.getString("user", default_user);
    Log.d("SHARED CHECK", user);
    if (user.equals(default_user)) {
        SharedPreferences.Editor edit = pref.edit();
        edit.putString("user", "new_user");
        boolean ok = edit.commit();
        user = pref.getString("user", default_user);
        Log.d("SHARED WRITE", user);
        Toast.makeText(this, user + " Save process: " + ok, Toast.LENGTH_LONG).show();
    } else {
        Log.d("SHARED READ", user);
        Toast.makeText(this, "READ SharedPrefs: " + user, Toast.LENGTH_LONG).show();
    }

编辑:记录结果

该块总是返回这个不正确的应用程序,我不知道为什么

    //first run
    SHARED CHECK Default_User
    SHARED WRITE new_user

    //each time after first
    SHARED CHECK Default_User
    SHARED WRITE new_user

该块始终返回此所有应用程序

    //first run
    SHARED CHECK Default_User
    SHARED WRITE new_user

    //each time after first
    SHARED CHECK new_user
    SHARED READ new_user

Ernir Erling.. 8

当您调用apply()commit()更改首次保存到应用程序的内存缓存中,然后Android会尝试将这些更改写入磁盘.这里发生的事情是您的commit()调用在磁盘上失败,但仍然会对应用程序的内存缓存进行更改,如源中可见.

从SharedPreferences中读取值是不够的,因为该值可能不会反映磁盘上的真实值,而只会反映存储在内存缓存中的值.

您未能做的是检查从commit()调用返回的布尔值,对于您的问题情况可能是错误的.commit()如果返回false,您可以重试几次.



1> Ernir Erling..:

当您调用apply()commit()更改首次保存到应用程序的内存缓存中,然后Android会尝试将这些更改写入磁盘.这里发生的事情是您的commit()调用在磁盘上失败,但仍然会对应用程序的内存缓存进行更改,如源中可见.

从SharedPreferences中读取值是不够的,因为该值可能不会反映磁盘上的真实值,而只会反映存储在内存缓存中的值.

您未能做的是检查从commit()调用返回的布尔值,对于您的问题情况可能是错误的.commit()如果返回false,您可以重试几次.



2> Chirag Savsa..:

只需使用以下方法并检查.

创建一个JavaAppTypeDetails.java

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class AppTypeDetails {

    private SharedPreferences sh;

    private AppTypeDetails() {
    }
    private AppTypeDetails(Context mContext) {
        sh = PreferenceManager.getDefaultSharedPreferences(mContext);
    }
    private static AppTypeDetails instance = null;
    public synchronized static AppTypeDetails getInstance(Context mContext) {
        if (instance == null) {
            instance = new AppTypeDetails(mContext);
        }
        return instance;
    }

    // get user status
    public String getUser() {
        return sh.getString("user", "");
    }
    public void setUser(String user) {
        sh.edit().putString("user", user).commit();
    }

    // Clear All Data
    public void clear() {
        sh.edit().clear().commit();
    }
}

现在设置SharedPreferences.

AppTypeDetails.getInstance(MainActivity.this).setUser();

获取价值表格SharedPreferences.

String userName = AppTypeDetails.getInstance(MainActivity.this).getUser();

现在使用userName做任何事情.

经常检查

if(userName.trim().isEmpty())
{
    // Do anything here.
}

因为在SharedPreferences我们设置用户名为空("")

要么

你可以设置用户名为null SharedPreferences然后你需要检查

if(userName != null){
    //do anything here
}

对于明确的数据SharedPreferences.

AppTypeDetails.getInstance(MainActivity.this).setUser("");

要么

AppTypeDetails.getInstance(MainActivity.this).clear();

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有