【问题标题】:ArrayList of custom objects not saving to SharedPreferences with GSON自定义对象的 ArrayList 未使用 GSON 保存到 SharedPreferences
【发布时间】:2018-09-16 03:11:36
【问题描述】:

我有一个 ArrayList 的自定义 POJO 对象,我想将它们保存到 SharedPreferences,这样它们就不会被垃圾收集,并且用户在应用程序关闭后仍然可以访问它们。

我曾尝试使用GSON,但我认为我缺少一些我看不到的东西。我的Object 转换为的String 已正确保存,但其中没有存储任何内容。

我正在使用这个Click event 来存储:

cartBut.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
            SharedPreferences mPrefs = getSharedPreferences("Cart", MODE_PRIVATE);
            SharedPreferences.Editor prefsEditor = mPrefs.edit();

            ArrayList<ItmModel> arrayList = new ArrayList<>();
            AtomicReference<ItmModel> itmModel = new AtomicReference<>(new ItmModel(item.getText().toString(), attr.getText().toString(),
                    pric.getText().toString(), sise.getText().toString(), image, company));
            arrayList.add(itmModel.get());

            Gson gson = new Gson();
            Type type = new TypeToken<ArrayList<ItmModel>>() {
            }.getType();
            String list = gson.toJson(arrayList, type);
            prefsEditor.putString("Cart", list);
            prefsEditor.apply();

        }
    });

我正在这样检索它:

SharedPreferences sharedPreferences = getSharedPreferences("Cart", MODE_PRIVATE);
    Gson gson = new Gson();
    String list = sharedPreferences.getString("Cart", "");
    Type type = new TypeToken<ArrayList<ItmModel>>() {
    }.getType();
    arrayList = gson.fromJson(list, type);
    if (arrayList == null) {
        arrayList = new ArrayList<>();
    }

    final CrtAdapter crtAdapter = new CrtAdapter(arrayList);

    RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
    recyclerView.setAdapter(crtAdapter);
    recyclerView.setHasFixedSize(true);
    recyclerView.setItemViewCacheSize(20);
    recyclerView.setDrawingCacheEnabled(true);
    recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
    recyclerView.setLayoutManager(linearLayoutManager);
    runLayoutAnimation(recyclerView);
    recyclerView.setOnFlingListener(null);

尽管我做了所有尝试,RecyclerView 始终是空的,当我签入我的File explorer 时,Preference 是空的,就像在这个 screenshot 中一样

还有这个

我的POJOParcelableSerializable。我可能做错了什么?我会发布任何需要的代码。谢谢。

这是我从点击事件的日志中得到的。我看到该对象已添加但后来从列表中删除。为什么会发生这种情况?

04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26 (SharedPreferencesImpl-load): calling run()
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: exiting
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: detach (group=0x418d8ce0)
**04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: removing from list
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: bye!
04-06 09:53:43.143 4078-4078/kamble.gml.woodleyint D/Cart: [[]]**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26 (pool-3-thread-1): calling run()

这是我的POJO

public class ItmModel extends ArrayList implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
    @Override
    public ItmModel createFromParcel(Parcel in) {
        return new ItmModel(in);
    }

    @Override
    public ItmModel[] newArray(int size) {
        return new ItmModel[size];
    }
};
private String name;
private String attr;
private String size;
private String pric;
private String imag;
private String comp;

public ItmModel(String name, String attr, String size, String pric, String imag, String comp) {
    this.name = name;
    this.attr = attr;
    this.size = size;
    this.pric = pric;
    this.imag = imag;
    this.comp = comp;
}

public ItmModel() {

}

private ItmModel(Parcel in) {
    name = in.readString();
    attr = in.readString();
    size = in.readString();
    pric = in.readString();
    imag = in.readString();
    comp = in.readString();
}

public String getName() {
    return name;
}

public void setName(String companyName) {
    this.comp = companyName;
}

public String getAttr() {
    return attr;
}

public void setAttr(String attr) {
    this.attr = attr;
}

public String getSize() {
    return size;
}

public void setSize(String size) {
    this.size = size;
}

public String getPric() {
    return pric;
}

public void setPric(String pric) {
    this.pric = pric;
}

public String getImag() {
    return imag;
}

public void setImag(String imag) {
    this.imag = imag;
}

public String getComp() {
    return comp;
}

public void setComp(String comp) {
    this.comp = comp;
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(name);
    dest.writeString(attr);
    dest.writeString(size);
    dest.writeString(pric);
    dest.writeString(imag);
    dest.writeString(comp);
}}

【问题讨论】:

  • 你在prefsEditor.putString("Cart", list);之前调试过你的代码
  • 可以插入但列表好像是空的
  • @rajanks 是的,但为什么会发生这种情况?我已经检查了代码,但我认为我做的一切都是正确的,不是这样吗?
  • @jakeoliver 让我现在就做。我会回复你
  • @jakeoliver 我刚刚编辑了我的问题

标签: android arraylist sharedpreferences pojo gson


【解决方案1】:

检查一下,它可能对你有帮助

 private void savePinnedFeedsToPrefrence(int position) {
    PreferenceManager preferenceManager = new PreferenceManager(this);
    Gson gson = new Gson();
    String pinnedList = preferenceManager.getPinnedFeeds(AppConstants.PINNED_FEEDS);
    List<FootballFeed> pinnedFeedsList;
    if ("".contentEquals(pinnedList)) {
        pinnedFeedsList = new ArrayList<>();
    } else {
        pinnedFeedsList = gson.fromJson(pinnedList,
                new TypeToken<List<FootballFeed>>() {
                }.getType());
    }
    pinnedFeedsList.add(footballFeeds.get(position));
    preferenceManager.savePinnedFeeds(gson.toJson(pinnedFeedsList));
}

这些是我的检索方法,

 public void savePinnedFeeds(String value) {
    editor.putString(AppConstants.PINNED_FEEDS, value);
    editor.commit();
}
public String getPinnedFeeds(String key) {
    return sharedPreferences.getString(AppConstants.PINNED_FEEDS, "");
}

【讨论】:

  • 让我看看
  • 遗憾的是它没有用,我找到了答案。问题出在我的 pojo 上。谢谢你的回复
【解决方案2】:

尝试删除AtomicReference并直接将item添加到list

ArrayList<ItmModel> arrayList = new ArrayList<>();
ItmModel itmModel = new ItmModel(item.getText().toString(), attr.getText().toString(),pric.getText().toString(), sise.getText().toString(), image, company);
arrayList.add(itmModel);

Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();

你为什么还要在POJO中扩展ArrayList,删除并修改你的POJO的一部分到下面

public class ItmModel implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
    @Override
    public ItmModel createFromParcel(Parcel in) {
        return new ItmModel(in);
    }

    @Override
    public ItmModel[] newArray(int size) {
        return new ItmModel[size];
    }
};
@Expose
private String name;
@Expose
private String attr;
@Expose
private String size;
@Expose
private String pric;
@Expose
private String imag;
@Expose
private String comp;
 //rest of code as it is
}

【讨论】:

  • 我刚试过了,但没用。字符串还是空的
  • 分享你的ItmModel POJO
  • 我马上贴出来
  • 发布了pojo
  • 这工作先生。非常感谢。这就是问题。现在一切都很好。希望我能投票两次
【解决方案3】:
To save custom array list you need to follow bellow step:
step 1: You need to creat cutom bean class.
public class Bean {

    String name,number;

    public Bean(String name,String number){
        this.name=name;
        this.number=number;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}

step 2: You need to create function to save array list to SharedPreferences.

public void saveArrayList(ArrayList<Bean> list, String key) {

        SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        Gson gson = new Gson();
        String json = gson.toJson(list);
        editor.putString(key, json);
        editor.apply();     // This line is IMPORTANT !!!

    }

step 3: You need to create function to get array list from SharedPreferences.

    public ArrayList<Bean> getArrayList(String key)
    {

        SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
        Gson gson = new Gson();
        String json = prefs.getString(key, null);
        Type type = new TypeToken<ArrayList<Bean>>() {}.getType();
        return gson.fromJson(json, type);

    }

step 4: How to call save and retrieve array list function.

ArrayList<Bean> listSave=new ArrayList<>();
listSave.add(new Bean("test","1"));
listSave.add(new Bean("test","2"));
saveArrayList(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<Bean> listGet=new ArrayList<>();
listGet=getArrayList("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());

=> 别忘了在应用级 build.gradle 中添加 gson 库。

实现'com.google.code.gson:gson:2.8.2'

【讨论】:

    猜你喜欢
    • 2017-12-28
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多