繁体   English   中英

SharedPreferences 会覆盖其他值吗?

[英]SharedPreferences overwrite other value?

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

第一段:

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;
}

在提问之前检查api 文档

解释

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

可存储类型

  • 布尔值
  • 漂浮
  • 整数
  • 细绳
  • 设置<字符串>

简单的解决方案

// 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

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

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

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

位置

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

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 方法。 同样,您可以使用位置作为参数调用 getContact() 来获取联系人。

更好的方法是使用数据库。但是如果你想使用 SharedPreferences 来保存你的数据,你可以创建 Serializable 类 User 和类 Preference 来管理你的 SharedPreferences 正如@AmitBhati所说。

    public class Preference {

    private static final String USER_JSON = "user_json";

    private SharedPreferences mSettings;
    private Context ctx;

    public Preference(Context context) {
        ctx = context;
        mSettings = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public void setUsersJson(List<User> u){
        Gson gson = new Gson();
        String jsonStr = gson.toJson(u);
        SharedPreferences.Editor editor = mSettings.edit();
        editor.putString(USER_JSON, jsonStr);
        editor.apply();
    }
    public List<User> getUsersJson(){
        Gson gson = new Gson();
        String jsonStr = mSettings.getString(USER_JSON, null);
        Type listType = new TypeToken<List<HourlyWeather>>(){}.getType();
        return (List<User>) gson.fromJson(jsonStr, listType);
    }
}

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

字符串字符串=key_val_;

for(int i=0;i < n; i++){

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

不确定它是否会导致您的情况出现内存问题。

通常,共享首选项用于小数据,并且在您的应用程序中不存储大数据。每个键在共享首选项中保留一个值。 可能,如果“name”键存储一些数据,您可以将“name”键更改为“name1”,但处理异常并不容易和困难。 您可以使用 Sqlite,通过查询更容易控制数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM