SharedPreferences会覆盖其他值吗?

时间:2017-02-07 07:10:28

标签: java android sharedpreferences

我是android.here的新手我制作简单的联系人列表应用程序。当用户点击联系人项目时,请联系添加到收藏夹列表中。但问题是,当用户点击第一个联系人项目添加收藏夹,然后用户点击第二个联系人,但第一个项目被自动删除。共享首选项覆盖其他值,我想在列表中添加项目,以便我在收藏夹列表中添加联系人。

First Fragment:

imageViewfavourite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
                SharedPreferences.Editor editor = preferences.edit();

                editor.putString("name1", Pname);
                editor.putString("number1", Pnumber);
                editor.putString("image1", temp);
                editor.putInt("pos", position);

                Log.e("a", "name1" + Pname);
                Log.e("a", "number1" + Pnumber);
                Log.e("a", "image1" + temp);

                editor.commit();

            }
        });

第二片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.fragment_fragment_fv, container, false);
recyclerView = (RecyclerView) view.findViewById(R.id.favourite_list);
selectUsers = new ArrayList<DataContact>();

SharedPreferences preferences = getActivity().getPreferences(0);
String Pname = preferences.getString("name1", "");
String Pnumber = preferences.getString("number1", "");
String Pimage = preferences.getString("image1", "");

byte[] encodeByte = Base64.decode(Pimage, Base64.DEFAULT);
bitmap = BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);

Log.v("name1", Pname);
Log.v("number1", Pnumber);
Log.v("image1", Pimage);

DataContact selectUser = new DataContact();
selectUser.setName(Pname);
selectUser.setPhone(Pnumber);
selectUser.setThumb(bitmap);
selectUsers.add(selectUser);

adapter = new AdapterFv(getActivity(), "");
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
llm.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(llm);
adapter.setData(selectUsers);
recyclerView.setAdapter(adapter);

return view;
}

6 个答案:

答案 0 :(得分:0)

在共享首选项中,如果您使用覆盖您的值的相同密钥,则通过KEY放置值和编辑值。因为共享首选项包含KEY VALUE对,如果要存储数据则使用SQLite数据库。共享首选项只能包含每个键的单个值

答案 1 :(得分:0)

在提问之前检查api documentation

<强>解释

SharedPreferences支持商店数据(1:1键值匹配)因此,一个键只能有一个数据项。

  

可存储类型

     
      
  • 布尔
  •   
  •   
  • INT
  •   
  •   
  • 字符串
  •   
  • 组&LT;字符串&GT;
  •   

简单解决方案

// in Second Fragment 
String Pname = preferences.getString("name2", "");
String Pnumber = preferences.getString("number2", "");
String Pimage = preferences.getString("image2", "");

<强>参考

https://developer.android.com/reference/android/content/SharedPreferences.html

答案 2 :(得分:0)

您正在添加第二个联系人,其中包含您用于首次联系的相同密钥。 您需要的是某种计数器,它可以跟踪您保存的联系人数量,然后相应地修改您的密钥。

如果我没错,那么你正在使用

  

位置

作为柜台。您只需要修改密钥即可。 一个好的解决方案是使用单独的方法来编写和提取共享首选项的联系人。

public void writeContact(String Pname, String Pnumber, String temp,int position)
{
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
            SharedPreferences.Editor editor = preferences.edit();

            editor.putString("name"+position, Pname);
            editor.putString("number"+position, Pnumber);
            editor.putString("image"+position, temp);

            editor.commit();
}


public DataContact getContact(int position)
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

    DataContact selectUser = new DataContact();

    selectUser.setName(preferences.getString("name"+position, ""));
    selectUser.setPhone( preferences.getString("number"+position, ""));
    selectUser.setThumb(preferences.getString("image"+position, ""));

    return selectUser;
}

这应该这样做。 现在要保存您的联系人,您需要在onClick()中调用writeContact方法。 类似地,您可以使用position作为参数调用getContact()来获取联系人。

答案 3 :(得分:0)

更好的方法是使用database.But如果你想使用SharedPreferences来保存你的数据,你可以创建Serializable类用户和类首选项来管理你的SharedPreferences,如@AmitBhati所说。

#sqr {
    position: relative;
    height: 400px;
    width:100%;
    max-width: 400px;
    background-color: red;
}
#circle1 {
    position: absolute;
    top: 400px;
    width:100%;
    max-width: 400px;
    height:100%;
    max-height:400px;
    border-radius: 50%;
    background-color: blue;
}
#circle2 {
    position: absolute;
    top: 800px;
    width:100%;
    max-width: 400px;
    height:100%;
    max-height:400px;
    border-radius: 50%;
    background-color: green;
}

答案 4 :(得分:0)

我也在使用共享偏好,对同一主题有疑问,是否可以覆盖。考虑到联系人列表的大小,你的问题似乎与我的有点不同,我使用的是创建一个单独的函数,我将发送键值,例如:key_val_,现在因为将有'n'个联系人用于循环并添加它用上面的字符串。

String string = key_val _;

for(int i = 0; i&lt; n; i ++){

editor.putInt(string + i,ur_value); }

不确定是否会导致内存问题。

答案 5 :(得分:0)

通常,共享首选项用于存储小数据,并且在您的应用中不存储大数据。每个键在共享首选项中保留一个值。可能的是,如果“名称”键存储了一些数据,则可以将“名称”键更改为“名称1”,但这并不容易并且很难处理异常。您可以使用Sqlite,使用查询控制数据更加容易。