Java 如何存储SharedReferences中特定值的所有键

Java 如何存储SharedReferences中特定值的所有键,java,android,sharedpreferences,key-value,Java,Android,Sharedpreferences,Key Value,在我的android应用程序中,我有一个自定义的已安装应用程序列表视图,旁边有一个复选框。我使用SharedReferences来存储布尔值true表示选中,false表示未选中。键值是应用程序的packagename,该值为布尔值,为true或false 我试图存储所有键(packagename)和值--true,所有这些值一起存储,这样我就可以在另一个类中为特定任务使用packagename。但是,我希望存储所有密钥的数据结构保持不变,即使在应用程序被终止时也保留所有选中的packagen

在我的android应用程序中,我有一个自定义的已安装应用程序列表视图,旁边有一个复选框。我使用SharedReferences来存储布尔值true表示选中,false表示未选中。键值是应用程序的packagename,该值为布尔值,为true或false

我试图存储所有键(packagename)和值--true,所有这些值一起存储,这样我就可以在另一个类中为特定任务使用packagename。但是,我希望存储所有密钥的数据结构保持不变,即使在应用程序被终止时也保留所有选中的packagename密钥

目前,我使用的代码如下:

String findKey(SharedPreferences sharedPreferences, String value) {
    for (Map.Entry<String, ?> entry: sharedPreferences.getAll()) {
        if (value.equals(entry.getValue())) {
            return entry.getKey();
        }
    }
    return null; // not found
}
String findKey(SharedReferences SharedReferences,字符串值){
for(Map.Entry:SharedReferences.getAll()){
if(value.equals(entry.getValue())){
return entry.getKey();
}
}
返回null;//未找到
}
我尝试过研究,但仍然无法找到解决方案

我如何正确地实现这一点,使我的所有packagenames都位于一个数据结构中,我可以在另一个类中使用它,并在应用程序被终止时将其与相同的内容一起存储

这是我的适配器类中的代码:

    for(int i= 0; i<packageList.size(); i++){
        PACKAGE_NAME = packageInfo.packageName;

        sharedPrefs = context.getSharedPreferences(PACKAGE_NAME, Context.MODE_PRIVATE);


        holder.ck1.setChecked(sharedPrefs.getBoolean(PACKAGE_NAME,false));


    }

    holder.ck1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {


            SharedPreferences.Editor editor = context.getSharedPreferences(packageInfo.packageName, Context.MODE_PRIVATE).edit();

            if (holder.ck1.isChecked()) {
                itemChecked[position] = true;
                holder.ck1.setChecked(true);
                editor.putBoolean(packageInfo.packageName, true);

                editor.apply();

            } else {
                itemChecked[position] = false;
                holder.ck1.setChecked(false);
                editor.putBoolean(packageInfo.packageName, false);

                editor.apply();

            }

        }


    });

for(int i=0;i根据你的帖子,我不知道你到底想要什么。因为SharedReference在xml文件中保存了很多值,所以你可以在应用程序中的任何地方访问它,而当应用程序被终止时它不会丢失

我在使用SharedRef时看到一些问题:

保存值时:

  • 更改或存储值后,它必须具有editor.commit()
  • 我认为您的代码将每个值存储在一个SharedReference文件中。这不是必需的。您应该使用差分键将所有值保存在一个文件中

您应该阅读,它将帮助您了解更多关于SharedPreference的信息。

只是从我的评论中延伸出来。这里看一下

    final String CHECKBOX_DATA="CHECKBOX_DATA";
    JSONObject js=new JSONObject();
    js.put("package.name1", true);
    js.put("package.name2", false);
    js.put("package.name3", true);
    js.put("package.name4", true);

SharePreferences prefs=context.getSharedPreferences(context.getPackageName(),Context.MODE_PRIVATE);
prefs.edit().putString(CHECKBOX_DATA, js.toString()).commit();
然后检索与

SharedPreferences prefs = context.getSharedPreferences(
            context.getPackageName(), Context.MODE_PRIVATE);
String json=prefs.getString(CHECKBOX_DATA, null);
JSONObject jsobj=new JSONObject(json);
Iterator<String> iter = jsobj.keys();

while (iter.hasNext()) {
    String key = iter.next();//This is your packagename
    try {
        boolean value = jsobj.getBoolean(key);
    } catch (JSONException e) {
        // Something went wrong!
    }
}
SharedReferences prefs=context.getSharedReferences(
context.getPackageName(),context.MODE_PRIVATE);
String json=prefs.getString(复选框_DATA,null);
JSONObject jsobj=新的JSONObject(json);
迭代器iter=jsobj.keys();
while(iter.hasNext()){
String key=iter.next();//这是您的packagename
试一试{
布尔值=jsobj.getBoolean(键);
}捕获(JSONException e){
//出了点问题!
}
}

对不起,现在我明白你的问题了

在Android>=3.0(API 11)中,可以通过


在Android中,我成功地使用SharedReferences来存储复选框值。我想要的是将所有保存值true的键存储为持久应用程序数据。VAdaihiep,这不是真的。不需要editor.commit()。editor.apply()也可以使用。另请参阅,您似乎不明白OP做了什么。他确实在不同的键中存储了它。当他选中它时,选中的应用程序的包名称不同。他正在使用自定义列表视图显示用户安装的应用程序。如果您只需要一个数据结构,则可以在Shar中存储json字符串已删除以下格式的首选项。{“”:,“”:}然后使用jsonobject检索并解析它,并获取表示包名称的键。我看到了。有可能看到这样的示例吗?即使我退出应用程序并再次打开它,它也会被存储吗OP将包名称保存为内部数据存储中的字符串数组列表不是更有效吗?如果您使用em说的是SQlLite,我想不是。一个简单的密钥对值集需要一个更简单、更容易的存储,这似乎是正确的解决方案。如果结构比是更复杂的话。这似乎是一个相当长的方式来实现这样一个简单的任务。看看所有的JSON是什么?OP已经成功地存储了复选框states使用SharedReferences…他所要做的就是用true检索键值…@ShyamalKeshav:当你说的检索SP中的所有映射值时,应该如何区分packagenames和OP可能要存储的其他值。OP还需要一个存储相同值的结构,因此JSON似乎是正确的恰当的。
String allPackageName = "com.app1,com.app2,com.app3";
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("key_app_checked", allPackageName );
editor.commit();
String packageNameChecked = sharedPref.getString("allPackageName");
if(packageNameChecked !=null){
      String [] arrPackageNameChecked = packageNameChecked.split(",");
      //Do somethings with arrPackageNameChecked ...
}