如何在android中从Gson存储和检索对象?

如何在android中从Gson存储和检索对象?,android,gson,sharedpreferences,android-preferences,Android,Gson,Sharedpreferences,Android Preferences,在我的活动中,用户有一组他选择的图像,然后我想将它们存储在首选项中。然后用户离开活动,然后返回,我希望这些图像仍然加载到图像视图中。我正试图使用Gson来实现这一点,但我遇到了麻烦,看不出我做错了什么。 希望外部的洞察能帮助我找到这个显而易见的答案,我只是没有看到 多谢各位 这是到目前为止我的代码 private void savePreferencesForImages(String key, ArrayList<Image> imageList) { Sh

在我的活动中,用户有一组他选择的图像,然后我想将它们存储在首选项中。然后用户离开活动,然后返回,我希望这些图像仍然加载到图像视图中。我正试图使用Gson来实现这一点,但我遇到了麻烦,看不出我做错了什么。 希望外部的洞察能帮助我找到这个显而易见的答案,我只是没有看到

多谢各位

这是到目前为止我的代码

private void savePreferencesForImages(String key, ArrayList<Image> imageList)
    {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(imageList);
        editor.putString(key,json);
        editor.commit();
    }


//Storing Local data.
private void loadPreferences()
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

    Gson gson = new Gson();
    String gsonString = sharedPreferences.getString("userImages", "");
    ArrayList<Image> images = gson.fromJson(gsonString, Image.class);//Ask StackOverflow tomorrow.
}
private void savePreferencesForImages(字符串键,ArrayList imageList)
{
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(此);
SharedReferences.Editor=SharedReferences.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(imageList);
putString(key,json);
commit();
}
//存储本地数据。
私有void loadPreferences()
{
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(此);
Gson Gson=新的Gson();
String gsonString=SharedReferences.getString(“userImages”,”);
ArrayList images=gson.fromJson(gsonString,Image.class);//明天询问StackOverflow。
}

在检索数据部分,您需要一个类型,将字符串反序列化为图像列表

比如:

private void loadPreferences()
{
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(此);
Gson Gson=新的Gson();
Type Type=new-TypeToken(){}.getType();
String gsonString=SharedReferences.getString(“userImages”,”);
List images=gson.fromJson(gsonString,type);
}

您可以做的一件事是单独保存图像,然后在检索时将其加载到ArrayList中

private void savePreferencesForImages(ArrayList<Image> imageList)
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    int imgKey = 0;
    for (Image img: imageList) {
        String json = gson.toJson(imageList);
        editor.putString("" + imgKey,json);
        editor.commit();
        imgKey++;
    }
}


private ArrayList<Image> loadPreferences()
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    Gson gson = new Gson();
    Map<String, ?> allPrefs = sharedPreferences.getAll();
    String gsonString = sharedPreferences.getString("userImages", "");
    ArrayList<Image> images = new ArrayList<Image>();
    if (!allPrefs.isEmpty()) {
        for (Map.Entry<String, ?> entry : allPrefs.entrySet()) {
            String json = entry.getValue().toString();
            Image temp = gson.fromJson(json, Image.class);
            images.add(temp);
        }
    }
    return images;
}
private void savePreferencesForImages(ArrayList imageList)
{
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(此);
SharedReferences.Editor=SharedReferences.edit();
Gson Gson=新的Gson();
int imgKey=0;
用于(图像img:imageList){
字符串json=gson.toJson(imageList);
putString(“+imgKey,json);
commit();
imgKey++;
}
}
私有ArrayList loadPreferences()
{
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(此);
Gson Gson=新的Gson();
Map allPrefs=SharedReferences.getAll();
String gsonString=SharedReferences.getString(“userImages”,”);
ArrayList images=新的ArrayList();
如果(!allPrefs.isEmpty()){
for(Map.Entry:allPrefs.entrySet()){
字符串json=entry.getValue().toString();
Image temp=gson.fromJson(json,Image.class);
图像。添加(临时);
}
}
返回图像;
}

这可能是最复杂的方法,但这是我能想到的第一件事。您还可以创建自己的ImageManager类或其他类,并使用getImage(键)方法等模拟ArrayList的行为。这将消除尝试保存ArrayList时带来的复杂性。

Image.class
无法加载到
ArrayList
这是您的问题吗?@cricket\u 007好吧,它给了我三条建议。我确实有一条错误信息在那条线上弹出。但是,我不确定哪一行可以确保我有一个名为images的ArrayList,它填充了用户的图像。或者:1)将变量“images”类型更改为图像库。2) 将“images”类型迁移到图像库3)使“fromJson”返回java.util。ArrayList@cricket_007我认为这不是一个重复的答案。那个它正在将一个Json对象转换为ArrayList。这就是您的代码试图做的,不是吗
fromJson
==“将JSON对象转换为ArrayList”?好吧,我不会转换任何东西。我正在将对象的arrayList保存到首选项中。然后,从首选项检索相同的ArrayList对象。我只想保存一个arrayList并在本地存储中检索一个arrayList。不尝试进行任何转换。也许有一种我不知道的更好的方法可以做到这一点:List images=gson.fromJson(reader,type)中的“reader”是什么;是的,我也遇到过这种情况(谢谢你的解决方案)。因此,我使用了Gson库,它允许您通过几行代码将复杂的数据类型放入共享首选项中。如果你需要的话,我强烈建议你使用它。
private void savePreferencesForImages(ArrayList<Image> imageList)
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    Gson gson = new Gson();
    int imgKey = 0;
    for (Image img: imageList) {
        String json = gson.toJson(imageList);
        editor.putString("" + imgKey,json);
        editor.commit();
        imgKey++;
    }
}


private ArrayList<Image> loadPreferences()
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    Gson gson = new Gson();
    Map<String, ?> allPrefs = sharedPreferences.getAll();
    String gsonString = sharedPreferences.getString("userImages", "");
    ArrayList<Image> images = new ArrayList<Image>();
    if (!allPrefs.isEmpty()) {
        for (Map.Entry<String, ?> entry : allPrefs.entrySet()) {
            String json = entry.getValue().toString();
            Image temp = gson.fromJson(json, Image.class);
            images.add(temp);
        }
    }
    return images;
}