繁体   English   中英

将数组列表写入共享首选项而不覆盖

[英]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);

这将替换StringdetailsKeyjsonText 因此,您可能想检索当前值并追加新的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM