[英]Writing array list to shared prefs without overwriting
每次打开我的应用程序时,即在onCreate()
我都会向共享的首选项编写一个arraylist。 这是我的代码-
在onCreate()
,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("hi","List details : " + myList);
Prefs.storeDeviceDetails(myList);
Prefs.retrieveDeviceDetails();
Log.d("hi","Retrieved from Shared Prefs " + Prefs.retrieveDeviceDetails());
}
这是我的共享首选项代码-
public void storeDeviceDetails(final ArrayList<String> deviceDetails) {
SharedPreferences.Editor editor = context.getSharedPreferences("devicePrefs",Context.MODE_PRIVATE).edit();
Gson gson = new Gson();
String jsonText = gson.toJson(deviceDetails);
editor.putString("detailsKey", jsonText);
Log.d("hi","Data written in Prefs = " + jsonText);
editor.apply();
}
public String[] retrieveDeviceDetails() {
SharedPreferences prefs = context.getSharedPreferences("devicePrefs", MODE_PRIVATE);
String text = prefs.getString("detailsKey", null);
Gson gson = new Gson();
details = gson.fromJson(text, String[].class);
Log.d("hi","Array values = " + details);
return details;
}
打印的日志是-
D/hi: List details : [samsung, hero2lte, hero2ltexx, SM-G935F, 7.0, 2017-03-21 13:24:26]
D/hi: Data written in Prefs = ["samsung","hero2lte","hero2ltexx","SM-G935F","7.0","2017-03-21 13:24:26","samsung","hero2lte","hero2ltexx","SM-G935F","7.0","2017-03-21 13:24:26"]
D/hi: Array values = [Ljava.lang.String;@8982aeb
D/hi: Array values = [Ljava.lang.String;@2a01048
D/hi: Retrieved from Shared Prefs = [Ljava.lang.String;@2a01048
每次打开应用程序时,我的列表都会包含一些数据,这些数据与List details
日志中的数据相同。 写入首选项的数据不应被覆盖。 我的问题是-
1)如果我打开该应用程序,则Data written in Prefs
日志Data written in Prefs
数据应该具有我打开该应用程序的所有时间的数据。 这意味着,如果我打开该应用程序10次,则我必须拥有10套我没有的数据。 我总是有2组数据。
2)从共享首选项中读取时,我仅从String []
读取最新值,而不是所有值。
我该如何克服这个问题?
如果您不希望数据被覆盖。 从sharedPreferences中检索信息,将其添加到列表中,然后进行存储。
基本上,SharedPref在您的应用程序中生成一个XML文件,并将其保存为键值对。 (detailsKey,devicePrefs是您的密钥)。
覆盖SharedPreferences
的原因是实际上是在覆盖它。
String jsonText = gson.toJson(deviceDetails);
editor.putString("detailsKey", jsonText);
这将替换String
中detailsKey
与jsonText
。 因此,您可能想检索当前值并追加新的String。
就像是
SharedPreferences pref = context.getSharedPreferences("devicePrefs",Context.MODE_PRIVATE);
Gson gson = new Gson();
String jsonText = gson.toJson(deviceDetails);
String currentText = pref.getString("detailsKey", null);
if(currentText != null) // combine jsonText and currentText however you need it
pref.edit().putString("detailsKey", jsonText);
Log.d("hi","Data written in Prefs = " + jsonText);
editor.apply();
每次写入共享首选项时都创建一个值为0的整数,也要写入该值,并首先从共享首选项中加载i的下一次值,这样您就可以跟踪在共享首选项中写入的次数,然后跟踪在共享首选项中写入数据的次数通过在末尾连接i来追加您的密钥,以便每次更改密钥的值时,您都会在共享首选项中获得另一个条目。在加载循环时,对当前i的值进行加载,并且每次在循环中都出现i。 您将得到想要的东西。 希望您能理解我刚才说的:)一定可以锻炼一下。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.