Java 如何保存列表<;对象>;共享数据引用?

Java 如何保存列表<;对象>;共享数据引用?,java,android,sharedpreferences,Java,Android,Sharedpreferences,我有一个产品列表,我从webservice检索,当应用程序第一次打开时,应用程序从webservice获取产品列表。我想将此列表保存到共享首选项 List<Product> medicineList = new ArrayList<Product>(); public void saveListInLocal(ArrayList<ModelName> list, String key) { SharedPreferences prefs = Pref

我有一个产品列表,我从webservice检索,当应用程序第一次打开时,应用程序从webservice获取产品列表。我想将此列表保存到共享首选项

    List<Product> medicineList = new ArrayList<Product>();
public void saveListInLocal(ArrayList<ModelName> list, String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply();   }
public ArrayList<ModelName> getListFromLocal(String key)
{
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<ModelName>>() {}.getType();
return gson.fromJson(json, type);

}

如何保存此列表而不是每次都从Web服务请求?

您当前有两个选项
a) 使用SharedReferences
b) 使用SQLite并在其中保存值

如何执行
a) 共享引用
首先将列表存储为集合,然后在读取SharedReferences时将其转换回列表

Listtasks = new ArrayList<String>();
Set<String> tasksSet = new HashSet<String>(Listtasks);
PreferenceManager.getDefaultSharedPreferences(context)
    .edit()
    .putStringSet("tasks_set", tasksSet)
    .commit();
Listtasks=newarraylist();
Set tasksSet=newhashset(列表任务);
PreferenceManager.GetDefaultSharedReferences(上下文)
.edit()
.putstrengset(“任务集”,任务集)
.commit();
然后当你读到它时:

Set<String> tasksSet = PreferenceManager.getDefaultSharedPreferences(context)
    .getStringSet("tasks_set", new HashSet<String>());
List<String> tasksList = new ArrayList<String>(tasksSet);
Set tasksSet=PreferenceManager.getDefaultSharedReferences(上下文)
.getStringSet(“tasks_set”,new HashSet());
List tasksList=new ArrayList(tasksSet);
b) SQLite
一个很好的教程:

在SharedReferences中,您只能存储原语

一种可能的方法是使用GSON并将值存储到JSON的首选项中

Gson gson = new Gson();
String json = gson.toJson(medicineList);

yourPrefereces.putString("listOfProducts", json);
yourPrefereces.commit();

只能使用基元类型,因为首选项保留在内存中。但您可以使用的是使用Gson将类型序列化为json,并将字符串放入首选项:

private static SharedPreferences sharedPreferences = context.getSharedPreferences(STORE_FILE_NAME, Context.MODE_PRIVATE);

private static SharedPreferences.Editor editor = sharedPreferences.edit();

public <T> void setList(String key, List<T> list) {
    Gson gson = new Gson();
    String json = gson.toJson(list);

    set(key, json);
}

public static void set(String key, String value) {
    editor.putString(key, value);
    editor.commit();
}
private静态SharedReferences SharedReferences=context.getSharedReferences(存储\u文件\u名称,context.MODE\u private);
私有静态SharedReferences.Editor=SharedReferences.edit();
公共无效集合列表(字符串键,列表){
Gson Gson=新的Gson();
字符串json=gson.toJson(列表);
set(key,json);
}
公共静态无效集(字符串键、字符串值){
编辑器.putString(键,值);
commit();
}

下面的额外镜头@StevenTB评论

重审

 publicList<YourModel> getList(){
    List<YourModel> arrayItems;
    String serializedObject = sharedPreferences.getString(KEY_PREFS, null); 
    if (serializedObject != null) {
         Gson gson = new Gson();
         Type type = new TypeToken<List<YourModel>>(){}.getType();
         arrayItems = gson.fromJson(serializedObject, type);
     }
}
publicList getList(){
列出阵列项目;
String serializedObject=SharedReferences.getString(KEY\u PREFS,null);
if(serializedObject!=null){
Gson Gson=新的Gson();
Type Type=new-TypeToken(){}.getType();
arrayItems=gson.fromJson(serializedObject,类型);
}
}

您可以使用以下
Gson
进行操作:

  • 从webservice下载
    列表
  • 使用
    new Gson().toJson(medicineList,new TypeToken(){}.getType())
  • 将转换后的字符串保存到
    SharePreferences
    中,与正常操作一样

为了重建您的
列表
,您需要使用
Gson
中提供的fromJson方法还原流程。您可以使用Gson转换Object->JSON(.toJSON)和JSON->Object(.fromJson)

  • 使用所需的内容定义标记(例如):

  • 获取这些标签的共享参考

    private List<Product> getDataFromSharedPreferences(){
        Gson gson = new Gson();
        List<Product> productFromShared = new ArrayList<>();
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE);
        String jsonPreferences = sharedPref.getString(PRODUCT_TAG, "");    
    
        Type type = new TypeToken<List<Product>>() {}.getType();
        productFromShared = gson.fromJson(jsonPreferences, type);
    
        return preferences;
    }
    
  • 如果要保存产品阵列,请执行以下操作:

    private void addInJSONArray(Product productToAdd){
    
        Gson gson = new Gson();
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE);
    
        String jsonSaved = sharedPref.getString(PRODUCT_TAG, "");
        String jsonNewproductToAdd = gson.toJson(productToAdd);
    
        JSONArray jsonArrayProduct= new JSONArray();
    
        try {
            if(jsonSaved.length()!=0){
                jsonArrayProduct = new JSONArray(jsonSaved);
            }
            jsonArrayProduct.put(new JSONObject(jsonNewproductToAdd));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    
        //SAVE NEW ARRAY
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(PRODUCT_TAG, jsonArrayProduct);
        editor.commit();
    }
    

所有与JSON相关的答案都是可以的,但请记住,如果实现Java.io.Serializable接口,Java允许序列化任何对象。 这样,您也可以将其作为序列化对象保存到首选项。 以下是存储为首选项的示例: 我希望这可以帮助你作为一个选择

SharedPreferences mPrefs = getPreferences(MODE_PRIVATE);
为了节省

Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(myObject);
prefsEditor.putString("MyObject", json);
prefsEditor.commit();
为了得到

Gson gson = new Gson();
String json = mPrefs.getString("MyObject", "");
MyObject obj = gson.fromJson(json, MyObject.class);

如接受答案中所述,我们可以保存对象列表,如:

public <T> void setList(String key, List<T> list) {
        Gson gson = new Gson();
        String json = gson.toJson(list);
        set(key, json);
    }

    public void set(String key, String value) {
        if (setSharedPreferences != null) {
            SharedPreferences.Editor prefsEditor = setSharedPreferences.edit();
            prefsEditor.putString(key, value);
            prefsEditor.commit();
        }
    }
public void setList(字符串键,列表){
Gson Gson=新的Gson();
字符串json=gson.toJson(列表);
set(key,json);
}
公共无效集(字符串键、字符串值){
if(setSharedPreferences!=null){
SharedReferences.Editor prefsEditor=setSharedPreferences.edit();
prefsEditor.putString(键、值);
提交();
}
}
通过以下方式获取:

public List<Company> getCompaniesList(String key) {
    if (setSharedPreferences != null) {

        Gson gson = new Gson();
        List<Company> companyList;

        String string = setSharedPreferences.getString(key, null);
        Type type = new TypeToken<List<Company>>() {
        }.getType();
        companyList = gson.fromJson(string, type);
        return companyList;
    }
    return null;
}
公共列表GetCompanyList(字符串键){
if(setSharedPreferences!=null){
Gson Gson=新的Gson();
上市公司名单;
String String=setSharedPreferences.getString(key,null);
Type Type=new-TypeToken(){
}.getType();
companyList=gson.fromJson(字符串,类型);
返回公司列表;
}
返回null;
}

这是我和您的最佳解决方案:

private static SharedPreferences sharedPreferences = context.getSharedPreferences(STORE_FILE_NAME, Context.MODE_PRIVATE);
private  SharedPreferences.Editor editor = sharedPreferences.edit();
List<your object> list = new ArrayList<>();
对于get:

list = new Gson().fromJson(sharedPreferences.getString("your key name", null), new TypeToken<List<your object class name>>(){}.getType());
list=new Gson();

享受吧

首先,您需要创建将数组列表保存到SharedReferences的函数

    List<Product> medicineList = new ArrayList<Product>();
public void saveListInLocal(ArrayList<ModelName> list, String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply();   }
public ArrayList<ModelName> getListFromLocal(String key)
{
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<ModelName>>() {}.getType();
return gson.fromJson(json, type);

}
public void saveListInLocal(数组列表,字符串键){
SharedReferences prefs=PreferenceManager.GetDefaultSharedReferences(活动);
SharedReferences.Editor=prefs.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(列表);
putString(key,json);
editor.apply();}
您需要创建函数以从SharedReferences获取数组列表

    List<Product> medicineList = new ArrayList<Product>();
public void saveListInLocal(ArrayList<ModelName> list, String key) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply();   }
public ArrayList<ModelName> getListFromLocal(String key)
{
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<ModelName>>() {}.getType();
return gson.fromJson(json, type);

}
public ArrayList getListFromLocal(字符串键)
{
SharedReferences prefs=GetSharedReferences(“AppName”,Context.MODE\u PRIVATE);
Gson Gson=新的Gson();
String json=prefs.getString(key,null);
Type Type=new-TypeToken(){}.getType();
返回gson.fromJson(json,类型);
}
如何调用保存和检索数组列表函数

 ArrayList<ModelName> listSave=new ArrayList<>();
 listSave.add("test1"));
 listSave.add("test2"));
 saveListInLocal(listSave,"key");
 Log.e("saveArrayList:","Save ArrayList success");
 ArrayList<ModelName> listGet=new ArrayList<>();
 listGet=getListFromLocal("key");
 Log.e("getArrayList:","Get ArrayList size"+listGet.size());
ArrayList listSave=新建ArrayList();
添加(“test1”);
添加(“test2”);
saveListInLocal(listSave,“键”);
Log.e(“saveArrayList:,“savearraylistsuccess”);
ArrayList listGet=新建ArrayList();
listGet=getListFromLocal(“键”);
Log.e(“getArrayList:”,“getArrayList size”+listGet.size());

您只能将原语值保存到SharedReference。从JSONArray检索产品数组的代码是什么?您不能像尝试使用这一行那样将json直接放入SharedReference:
editor.putString(PRODUCT_标记,jsonArrayProduct)必须首先将其转换为字符串(可能在代码中使用Gson对象)。例如:
gs