每次我的应用程序打开时,我都会在共享prefs中写一个arraylist,即onCreate()
。这是我的代码 -
在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
个日志。写入prefs的数据不应被覆盖。
我的问题是 -
1)如果我打开应用程序,Data written in Prefs
日志应该包含我打开应用程序的所有数据。这意味着如果我打开应用程序10次,我必须有10组数据,我没有。
我总是有两组数据。
2)当我从共享首选项中读取时,我只读取String []
的最新值而不是所有值。
我如何克服这些问题?
答案 0 :(得分:0)
如果您不希望覆盖您的数据。从sharedPreferences中检索信息,将其添加到列表中,然后存储它。
SharedPref基本上在您的应用中创建一个XML文件,并将其保存在键值对中。 (detailsKey,devicePrefs是你的关键)。
答案 1 :(得分:0)
你覆盖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();
答案 2 :(得分:0)
每次写入共享首选项时创建一个值为0的整数也写入,并首先从共享首选项加载i的下一个时间值,这样您就可以跟踪在共享首选项中写入的次数,然后编写数据在共享首选项中,通过在结尾处连接i来附加您的密钥,因此每次更改密钥值时,您都会在共享首选项中获得另一个条目。使用加载循环获取当前i的值,并且每次使用键入循环来加载i。你会得到你想要的。我希望你能理解我刚刚说的话:)它肯定会锻炼尝试一下。