【问题标题】:shared preferences doesn't commit共享首选项不提交
【发布时间】:2012-07-29 21:14:03
【问题描述】:

我有一些带有“场地”的列表视图,城市中的地方。当你点击它时,你会使用 ID 进入 Venue 页面。

在这个场地页面上,有一个小添加按钮,上面有一个 +。当你按下这个时,我需要:

  • 为了从共享首选项中获取其他收藏夹列表,我将其保存为逗号分隔的字符串并将其转换为整数列表
  • 添加此项的id
  • 将整数列表重新转换为字符串,以逗号分隔。
  • 将此字符串保存在同一个键下,我使用“fav”

并进一步改变按钮的图像,使+变成-

我以为我设法做到了,我的代码在我的帖子底部。

现在我的问题是,我最喜欢的字符串并没有真正保存。出于某种原因(不知道为什么),每次我打开一个场所时,我从共享首选项中检索到的字符串中有两个值:null 和 333。即使我使用了 editor.clear();在启动活动中,当然使用了提交,它仍然具有相同的返回值。特别是 333 我猜很奇怪,但我认为我也排除了将 null 保存到字符串的可能性。

现在发生的事情是:当我单击按钮时,大多数时候它第一次没有反应。第二次左右,我记录了这个过程,然后 id 被添加到共享首选项中,我的按钮很好地改变了。然后在另一次按下,主要是第一次没有反应,第二次从收藏夹和按钮更改中删除。

但是当我离开我的活动并使用另一个 id 打开同一个活动时,字符串再次只有 null 和 333 值。

    final int favID = id;
        btFavourite.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View v) {
                if(isFavourite(favID)){
                    btFavourite.setBackgroundResource(R.drawable.btn_favourites_remove);
                    DeleteFavourite(favID);
                }else{
                    btFavourite.setBackgroundResource(R.drawable.btn_favourites_add);
                    MakeFavourite(favID);
                }

            }
        });

}


     private void SaveFavourites(List<Integer> favs){
            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            String commSepFavs = IntArrToComSepString(favs);
            editor.putString("favs", commSepFavs);
            editor.commit();
           }

           private List<Integer> LoadFavourites(){
            SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
            String favStr = sharedPreferences.getString("favs", "");
            System.out.println(favStr);
            if (favStr != null){
            return CommaSepStringToIntArr(favStr);
            }else{
                return null;
            }
            }

        public List<Integer> CommaSepStringToIntArr(String input){
               List <Integer> favs= new ArrayList<Integer>();
                    String[] separated = null;
                separated = input.split(",");
                 System.out.println("separated lengte " + separated.length);
                 String tijdelSep;
                for (int i=0;i<separated.length;i++){
                     tijdelSep = separated[i].replace(",","").trim();
                    System.out.println("tijdelSep "+i+" = " + tijdelSep);
                if(tijdelSep != null && tijdelSep.equals("")==false &&tijdelSep.equals("null")==false){
                    favs.add(Integer.parseInt(tijdelSep));
                }
                }
            return favs;
            }

           public String IntArrToComSepString(List<Integer> favs){
               String comSepFavs = null;
               for (int i=0;i<favs.size();i++){
                   comSepFavs = comSepFavs +","+String.valueOf(favs.get(i));
               }
            return comSepFavs;  
           }

           public boolean isFavourite(int id){
               boolean isFav = false;
               List<Integer> favs = LoadFavourites();
               for (int i=0;i<favs.size();i++){
                    if(favs.get(i)==id){
                        isFav=true;
                    }
                }
               return isFav;               
           }

           public void MakeFavourite(int id){
               List<Integer> favs = LoadFavourites();
               List<Integer> newfavs = new ArrayList<Integer>();
               for (int i=0;i<favs.size();i++){
                   newfavs.add(favs.get(i));
               }
               newfavs.add(id);
               SaveFavourites(newfavs);
           }

           public void DeleteFavourite(int id){
               List<Integer> favs = LoadFavourites();
               List<Integer> newfavs = new ArrayList<Integer>();
               int j=0;
               for (int i=0;i<favs.size();i++){
                   if(favs.get(i) != id){
                   newfavs.add(favs.get(i));
                   j++;
                   }
               }
               SaveFavourites(newfavs);
           }

【问题讨论】:

  • 我很好奇您为什么要使用 SharedPreferences 跳过所有这些障碍。听起来像是 SQLite 数据库中的一个表的工作,它只列出了用户收藏的所有场所的 ID。因此,当您显示图标时,请检查数据库以查看它是否在其中。还是我误会了什么?

标签: java android string arraylist sharedpreferences


【解决方案1】:

我不确定,但您的问题可能出在SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

AFAIK,你应该使用类似的东西:SharedPreferences sharedPreferences = getPreferences("prefs_file_name", MODE_PRIVATE); 而不是你拥有的那一行。

您也可以将首选项保存在默认共享首选项中。使用SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

查看getDefaultSharedPreferences (Context context) 方法规范。

【讨论】:

    【解决方案2】:

    您能否发布更多(即您的所有活动)代码?除此之外,我还认为您应该使用数据库,您对共享首选项的调用是可以的(您的调用只是调用 sharedPreferences(String, int) 并将活动名称作为字符串。每次打开活动时,该文件都会持续存在,直到您实际上删除了它。共享首选项几乎只是存储在设备上的平面文件。

    一些事情: 1)当您执行 editor.clear() 时 - 您是否提交了 2) 您是否对该编辑器进行了其他更改(例如 editor.putString() 或其他内容)。它实际上不会清除文件,它会清除它然后插入该编辑器实例上添加的任何内容

    2) null 和 "" 对于字符串来说不是一回事。这就是为什么当您将 String 初始化为 null 时它给您一个 null 的原因。

    如果您可以发布更多代码,我可以尝试提供更多帮助。另外,ID 是如何传递给您的活动的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-08
      • 1970-01-01
      • 2017-05-23
      • 2019-04-09
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多