Java 如何保存列表<;对象>;共享数据引用?
我有一个产品列表,我从webservice检索,当应用程序第一次打开时,应用程序从webservice获取产品列表。我想将此列表保存到共享首选项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
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(); }
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