簡體   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