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

时间:2017-03-21 13:18:39

标签: java android

每次我的应用程序打开时,我都会在共享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 []的最新值而不是所有值。

我如何克服这些问题?

3 个答案:

答案 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。你会得到你想要的。我希望你能理解我刚刚说的话:)它肯定会锻炼尝试一下。