java.lang.String 无法转换为 java.lang.Integer SharedPreferences

问题描述 投票:0回答:2

我一直潜伏在这里寻找答案,但我似乎找不到我的代码有什么问题。我有一个计算 Android 生命周期活动的程序。每次运行它时,当我尝试在 onCreate() 方法上检索数据时都会出现此错误。

private TextView numCreate;
private TextView numStart;
private TextView numResume;
private TextView numPause;
private TextView numStop;
private TextView numDestroy;

private int numc= 0;
private int nums= 0;
private int numr= 0;
private int nump= 0;
private int numst=0;
private int numd= 0;

private String pref  = "MYPREFERENCES";

private String CREATE_NUM_KEY  = "CREATE_NUM_KEY";
private String START_NUM_KEY   = "START_NUM_KEY";
private String RESUME_NUM_KEY  = "RESUME_NUM_KEY";
private String PAUSE_NUM_KEY   = "PAUSE_NUM_KEY";
private String STOP_NUM_KEY    = "STOP_NUM_KEY";
private String DESTROY_NUM_KEY = "DESTROY_NUM_KEY";



protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lifecycle);

    numCreate= findViewById(R.id.ocreateview);
    logContainer= findViewById(R.id.logContainer);

    sharedPref= getSharedPreferences(pref,Context.MODE_PRIVATE);

    numc = sharedPref.getInt(CREATE_NUM_KEY,0);
    nums = sharedPref.getInt(START_NUM_KEY,0);
    numr = sharedPref.getInt(RESUME_NUM_KEY,0);
    nump = sharedPref.getInt(PAUSE_NUM_KEY,0);
    numst = sharedPref.getInt(STOP_NUM_KEY,0);
    numd = sharedPref.getInt(DESTROY_NUM_KEY,0);

    numStart.setText(getNum(nums));
    numResume.setText(getNum(numr));
    numPause.setText(getNum(nump));
    numStop.setText(getNum(numst));
    numDestroy.setText(getNum(numd));


    logContainer.append("Triggered onCreate()!");
    logContainer.append("\n\r");


    numc++;
    numCreate.setText(getNum(numc));
    String tstamp = timestamp();
    tCreate.setText(tstamp);

    SharedPreferences.Editor editor = sharedPref.edit();

    editor.putInt(CREATE_NUM_KEY, numc);

    editor.commit();
    editor.apply();
}

“numc = sharedPref.getInt(CREATE_NUM_KEY,0);”这一行的错误点消息“java.lang.String 无法转换为 java.lang.Integer”。谢谢

java android android-studio sharedpreferences
2个回答
0
投票

方法

getSharedPreferences()
返回
SharedPreferences
,它基本上是一个
Map
和一个
Map
包含键和值,在
SharedPreferences
的情况下,值可以是任何东西,这意味着它不必是一个
int 
.看起来键
CREATE_NUM_KEY
的值是
String
而不是
Integer
。是什么让你认为这是
Integer


0
投票

在 Kotlin 中有同样的错误:

java.lang.String cannot be cast to java.lang.Integer at android.app.SharedPreferencesImpl.getInt
.

在我的案例中,错误的原因是有重复的
SharedPreference
键;其中一个表示为
String
类型值。因此,当我尝试访问 SharedPreference Map
Int
键时,重复的
String
键被转换为预期的
Int
导致错误。例如:

val PREFS_BASE_DIR = "com.example.example"
val PREFS_FILENAME = "$PREFS_BASE_DIR.utils.prefs"
private val CREATE_NUM_KEY = "CREATE_NUM_KEY"
private val CREATE_START_KEY = "CREATE_NUM_KEY"  // Duplicate key

private val prefs: SharedPreferences = context.getSharedPreferences(PREFS_FILENAME, Context.MODE_PRIVATE)

var num: String
        get() = prefs.getString(CREATE_NUM_KEY, "") ?: ""
        set(value) = prefs.edit().putString(CREATE_NUM_KEY, value).apply()
var start: Int
        get() {
            return prefs.getInt(CREATE_START_KEY,0)
        }
        set(value) = prefs.edit().putInt(CREATE_START_KEY, value!!).apply()

在您的代码中没有看到相同的错误。但它会让你不知所措。

© www.soinside.com 2019 - 2024. All rights reserved.