检查共享首选项中是不是存在密钥

Posted

技术标签:

【中文标题】检查共享首选项中是不是存在密钥【英文标题】:Check if key exists in Shared Preferences检查共享首选项中是否存在密钥 【发布时间】:2012-02-04 04:00:30 【问题描述】:

我正在按如下方式创建共享首选项

preferences = getSharedPreferences("text", 0);
final Editor editor = preferences.edit();

String s1 = serverIP.getText().toString();
String s2 = serverPort.getText().toString();
String s3 = syncPass.getText().toString();
String s4 = proxyServer.getText().toString();
String s5 = proxyPort.getText().toString();

editor.putString("SERVERIP", s1);
editor.putString("SERVERPORT", s2);
editor.putString("SYNCPASS", s3);
editor.putString("PROXYSERVER", s3);
editor.putString("PROXYPORT", s3);

和 onCreate 我想在一组新的 TextViews 中显示值,但是第一次我没有任何值存储在共享首选项中,并且会得到一个 NULL 指针异常。

我想知道是否有任何内置方法可以检查 SharedPreferences 是否包含任何值,以便我可以检查键是否存在,如果不存在,则替换具有首选项值的新 TextView 集。

【问题讨论】:

【参考方案1】:
    LoadRuns();
if (loadedruns == 1) 
Toast.makeText(MainActivity.this, "First run", Toast.LENGTH_SHORT).show(); 

else 
Toast.makeText(MainActivity.this, "No. runs: " + loadedruns,
Toast.LENGTH_SHORT).show();

loadedruns++;
SaveRuns("runs", loadedruns);


    public void SaveRuns(String key, int value)
sharedPreferences =  PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(key, value);
editor.commit();

public void LoadRuns()
sharedPreferences =  PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
loadedruns = sharedPreferences.getInt("runs", 1);

【讨论】:

请添加一些有关此代码为何有效的上下文。使答案更好,更有用。谢谢! :)【参考方案2】:

根据 Javadocs 尝试contains(String key)

检查首选项是否包含首选项。如果返回真 偏好存在于偏好中,否则为假。

【讨论】:

【参考方案3】:

试试

 SharedPreferences shf = getSharedPreferences("NAME_SharedPref", MODE_WORLD_READABLE);
    String strPref = shf.getString("SERVERIP", null);

    if(strPref != null) 
    // do some thing

    

【讨论】:

如果我想检查 int 值怎么办?【参考方案4】:

SharedPreferences 获取值的每个方法都有默认值,如果键不存在则返回该值

preferences = getSharedPreferences("text", 0);
String value = preferences.getString("unknown_key",null);
if (value == null) 
    // the key does not exist
 else 
    // handle the value

【讨论】:

这个是对的,但是如果key存在,但是value为空/null怎么办?示例: 尽管这是公认的答案,但我很确定作者 实际上 正在寻找的是preferences.contains( "unknown_key"); ...例如,如果您有一个布尔值偏好显然可以是真或假;如果你给出一个默认值,它会返回,如果它不存在,即使这可能是一个实际的可能值,所以它实际上不会告诉你偏好是否存在。 误导性答案 - 实际上prefsEditor.putString("now the key exists", null).commit(); 是完全合法的,键存在且值为空 - -1

以上是关于检查共享首选项中是不是存在密钥的主要内容,如果未能解决你的问题,请参考以下文章

Android 共享首选项分配不会在模拟器会话之间持续存在

在共享首选项中保存大型arraylists

整数共享首选项始终返回0

如何保存和获取存储在共享首选项中的包名称?

如何检测首选项中是不是进行了更改?

如何使用颤振中的键删除/清除共享首选项?