SharedPreferences 存储List数据的问题

yyy000112 2016-06-20 10:48:10
用 SharedPreferences 存储以下list数据后,例如从SharedPreferences 提取时date时只能显示一个数据,要想显示指定的,必须把i设置成具体的数才行
请教这段代码里面的被存储变量怎么样才能在SharedPreferences 中遍历出来


WeatherInfo wIf = gson.fromJson(s, WeatherInfo.class);
List<DailyForecast> dailyForecasts = wIf.getDaily_forecast();

for (int i = 0; i < 7; i++) {
DailyForecast dailyForecast = dailyForecasts.get(i);
String date = dailyForecasts.get(i).getDate();
Astro astro = dailyForecasts.get(i).getAstro();
String sr = astro.getSr();
String ss = astro.getSs();
Cond cond = dailyForecasts.get(i).getCond();
int cond_code = cond.getCode();
String cond_txt = cond.getTxt();
int cond_code_d = cond.getCode_d();
int cond_code_n = cond.getCode_n();
String cond_txt_d = cond.getTxt_d();
int hum_daily = dailyForecasts.get(i).getHum();
Tmp tmp_daily = dailyForecasts.get(i).getTmp();

saveDailyForecast(MyApplication.getContext(), date, sr, ss, cond_code, cond_txt, cond_code_d, cond_code_n, cond_txt_d, hum_daily,tmp_daily);
}

public static void saveDailyForecast(Context context, String date, String sr, String ss, int cond_code,
String cond_txt, int cond_code_d, int cond_code_n, String cond_txt_d,
int hum_daily, Tmp tmp_daily) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(context).edit();
editor.putString("date_daily", date);
editor.putString("astro_sr",sr);
editor.putString("astro_ss",ss);
editor.putInt("cond_code", cond_code);
editor.putString("cond_txt", cond_txt);
editor.putInt("cond_code_d", cond_code_d);
editor.putInt("cond_code_n", cond_code_n);
editor.putString("cond_txt_d", cond_txt_d);
editor.putInt("hum_daly", hum_daily);
editor.putInt("max_daily",tmp_daily.getMax());
editor.putInt("min_daily",tmp_daily.getMin());
editor.commit();
}
...全文
627 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
睡精灵 2016-07-02
  • 打赏
  • 举报
回复
引用 12 楼 yyy000112 的回复:
[quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
类似这种Json数据,建议用sharedpreference还是SQLite存储比较好。 HeWeather data service 3.0": [ { "basic": { "city": "大连", "cnty": "中国", "id": "CN101070201", "lat": "38.944000", "lon": "121.576000", "update": { "loc": "2015-07-15 10:43", "utc": "2015-07-15 02:46:14" } }, "status": "ok", "aqi": { "city": { "aqi": "71", "co": "1", "no2": "75", "o3": "101", "pm10": "89", "pm25": "44", "qlty": "良", "so2": "27" } }, "alarms": [ { "level": "橙色", "stat": "预警中", "title": "辽宁省大连市气象台发布高温橙色预警", "txt": "大连市气象台2015年07月14日13时31分发布高温橙色预警信号:预计14日下午至傍晚,旅顺口区局部最高气温将达到37℃以上,请注意防范。 ", "type": "高温" } ], "now": { "cond": { "code": "100", "txt": "晴" }, "fl": "33", "hum": "28", "pcpn": "0", "pres": "1005", "tmp": "32", "vis": "10", "wind": { "deg": "350", "dir": "东北风", "sc": "4-5", "spd": "11" } }, "daily_forecast": [ { "date": "2015-07-15", "astro": { "sr": "04:40", "ss": "19:19" }, "cond": { "code_d": "100", "code_n": "101", "txt_d": "晴", "txt_n": "多云" }, "hum": "48", "pcpn": "0.0", "pop": "0", "pres": "1005", "tmp": { "max": "33", "min": "24" }, "vis": "10", "wind": { "deg": "192", "dir": "东南风", "sc": "4-5", "spd": "11" } }, { "date": "2015-07-16", "astro": { "sr": "04:40", "ss": "19:18" }, "cond": { "code_d": "104", "code_n": "104", "txt_d": "阴", "txt_n": "阴" }, "hum": "82", "pcpn": "2.7", "pop": "82", "pres": "1008", "tmp": { "max": "27", "min": "23" }, "vis": "10", "wind": { "deg": "116", "dir": "东南风", "sc": "4-5", "spd": "11" } }, { "date": "2015-07-17", "astro": { "sr": "04:41", "ss": "19:17" }, "cond": { "code_d": "101", "code_n": "100", "txt_d": "多云", "txt_n": "晴" }, "hum": "70", "pcpn": "0.1", "pop": "11", "pres": "1006", "tmp": { "max": "28", "min": "22" }, "vis": "10", "wind": { "deg": "172", "dir": "西风", "sc": "4-5", "spd": "11" } } ], "hourly_forecast": [ { "date": "2015-07-15 10:00", "hum": "51", "pop": "0", "pres": "1006", "tmp": "32", "wind": { "deg": "127", "dir": "东南风", "sc": "微风", "spd": "4" } }, { [/quote] 这个要看你怎么使用这些数据,如果你需要筛选的话,那最好是存储到sqlite,如果每次都是全部拿出来用的话sharedpreference比较方便,对于大量的数据,还是建议sqlite。
yyy000112 2016-07-01
  • 打赏
  • 举报
回复
引用 1 楼 shuijinglingsos 的回复:
你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
类似这种Json数据,建议用sharedpreference还是SQLite存储比较好。 HeWeather data service 3.0": [ { "basic": { "city": "大连", "cnty": "中国", "id": "CN101070201", "lat": "38.944000", "lon": "121.576000", "update": { "loc": "2015-07-15 10:43", "utc": "2015-07-15 02:46:14" } }, "status": "ok", "aqi": { "city": { "aqi": "71", "co": "1", "no2": "75", "o3": "101", "pm10": "89", "pm25": "44", "qlty": "良", "so2": "27" } }, "alarms": [ { "level": "橙色", "stat": "预警中", "title": "辽宁省大连市气象台发布高温橙色预警", "txt": "大连市气象台2015年07月14日13时31分发布高温橙色预警信号:预计14日下午至傍晚,旅顺口区局部最高气温将达到37℃以上,请注意防范。 ", "type": "高温" } ], "now": { "cond": { "code": "100", "txt": "晴" }, "fl": "33", "hum": "28", "pcpn": "0", "pres": "1005", "tmp": "32", "vis": "10", "wind": { "deg": "350", "dir": "东北风", "sc": "4-5", "spd": "11" } }, "daily_forecast": [ { "date": "2015-07-15", "astro": { "sr": "04:40", "ss": "19:19" }, "cond": { "code_d": "100", "code_n": "101", "txt_d": "晴", "txt_n": "多云" }, "hum": "48", "pcpn": "0.0", "pop": "0", "pres": "1005", "tmp": { "max": "33", "min": "24" }, "vis": "10", "wind": { "deg": "192", "dir": "东南风", "sc": "4-5", "spd": "11" } }, { "date": "2015-07-16", "astro": { "sr": "04:40", "ss": "19:18" }, "cond": { "code_d": "104", "code_n": "104", "txt_d": "阴", "txt_n": "阴" }, "hum": "82", "pcpn": "2.7", "pop": "82", "pres": "1008", "tmp": { "max": "27", "min": "23" }, "vis": "10", "wind": { "deg": "116", "dir": "东南风", "sc": "4-5", "spd": "11" } }, { "date": "2015-07-17", "astro": { "sr": "04:41", "ss": "19:17" }, "cond": { "code_d": "101", "code_n": "100", "txt_d": "多云", "txt_n": "晴" }, "hum": "70", "pcpn": "0.1", "pop": "11", "pres": "1006", "tmp": { "max": "28", "min": "22" }, "vis": "10", "wind": { "deg": "172", "dir": "西风", "sc": "4-5", "spd": "11" } } ], "hourly_forecast": [ { "date": "2015-07-15 10:00", "hum": "51", "pop": "0", "pres": "1006", "tmp": "32", "wind": { "deg": "127", "dir": "东南风", "sc": "微风", "spd": "4" } }, { "date": "2015-07-15 13:00", "hum": "49", "pop": "0", "pres": "1005", "tmp": "34", "wind": { "deg": "179", "dir": "南风", "sc": "微风", "spd": "7" } }, { "date": "2015-07-15 16:00", "hum": "54", "pop": "0", "pres": "1005", "tmp": "31", "wind": { "deg": "216", "dir": "西南风", "sc": "微风", "spd": "6" } }, { "date": "2015-07-15 19:00", "hum": "62", "pop": "0", "pres": "1005", "tmp": "29", "wind": { "deg": "192", "dir": "西南风", "sc": "微风", "spd": "4" } }, { "date": "2015-07-15 22:00", "hum": "62", "pop": "0", "pres": "1006", "tmp": "26", "wind": { "deg": "154", "dir": "东南风", "sc": "微风", "spd": "10" } } ], "suggestion": { "comf": { "brf": "较舒适", "txt": "白天天气晴好,您在这种天气条件下,会感觉早晚凉爽、舒适,午后偏热。" }, "cw": { "brf": "较不宜", "txt": "较不宜洗车,未来一天无雨,风力较大,如果执意擦洗汽车,要做好蒙上污垢的心理准备。" }, "drsg": { "brf": "炎热", "txt": "天气炎热,建议着短衫、短裙、短裤、薄型T恤衫等清凉夏季服装。" }, "flu": { "brf": "少发", "txt": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。" }, "sport": { "brf": "较适宜", "txt": "天气较好,但风力较大,推荐您进行室内运动,若在户外运动请注意防风。" }, "trav": { "brf": "适宜", "txt": "天气较好,是个好天气哦。稍热但是风大,能缓解炎热的感觉,适宜旅游,可不要错过机会呦!" }, "uv": { "brf": "强", "txt": "紫外线辐射强,建议涂擦SPF20左右、PA++的防晒护肤品。避免在10点至14点暴露于日光下。" } } } ]
开发者_android 2016-06-28
  • 打赏
  • 举报
回复
个人觉得,可以直接把list通过流的形式转换成字符串,然后保存到sp中,读取时,再以流的形式读取objcet,直接强转成list. 保存: ByteArrayOutputStream baos = new ByteArrayOutputStream(3000); ObjectOutputStream oos=null; oos = new ObjectOutputStream(baos); oos.writeObject(List); String newWord = new String(Base64.encodeBase64(baos.toByteArray())); 读取: byte[] base64Bytes = Base64.decodeBase64(wordBase64 .getBytes()); ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes); ObjectInputStream ois; ois = new ObjectInputStream(bais); List<?,?> result = (List<?,?>) ois.readObject(); 这种形式,我在项目中使用过,可用。
yyy000112 2016-06-27
  • 打赏
  • 举报
回复
引用 9 楼 jklwan 的回复:
[quote=引用 8 楼 yyy000112 的回复:] 能否写个小示例让我参考一下呀
你的代码不是有WeatherInfo wIf = gson.fromJson(s, WeatherInfo.class);这一句吗,直接保存s就行了[/quote] 转成list也是只能一次性取出来吗,,
jklwan 2016-06-23
  • 打赏
  • 举报
回复
引用 8 楼 yyy000112 的回复:
能否写个小示例让我参考一下呀
你的代码不是有WeatherInfo wIf = gson.fromJson(s, WeatherInfo.class);这一句吗,直接保存s就行了
睡精灵 2016-06-22
  • 打赏
  • 举报
回复
引用 5 楼 yyy000112 的回复:
[quote=引用 4 楼 shuijinglingsos 的回复:] [quote=引用 3 楼 yyy000112 的回复:] [quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote]
引用 3 楼 yyy000112 的回复:
[quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote] 当然要放到循环里面了,放循环后面就是一条。[/quote] 要是把json存储到SharedPreferences 里面该怎么写,提取时可以很方便的把每个数据都提出来吗[/quote] 就是把整个数据转成json字符串存储,取的时候也只能一起取出来,不能一个一个取。如果数据量大的话建议用sqlite。
yyy000112 2016-06-22
  • 打赏
  • 举报
回复
引用 7 楼 jklwan 的回复:
直接存json字符串,取的时候转成list就行了。
能否写个小示例让我参考一下呀
jklwan 2016-06-22
  • 打赏
  • 举报
回复
直接存json字符串,取的时候转成list就行了。
睡精灵 2016-06-21
  • 打赏
  • 举报
回复
引用 3 楼 yyy000112 的回复:
[quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote]
引用 3 楼 yyy000112 的回复:
[quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote] 当然要放到循环里面了,放循环后面就是一条。
yyy000112 2016-06-21
  • 打赏
  • 举报
回复
引用 4 楼 shuijinglingsos 的回复:
[quote=引用 3 楼 yyy000112 的回复:] [quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote]
引用 3 楼 yyy000112 的回复:
[quote=引用 1 楼 shuijinglingsos 的回复:] 你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个[/quote] 当然要放到循环里面了,放循环后面就是一条。[/quote] 要是把json存储到SharedPreferences 里面该怎么写,提取时可以很方便的把每个数据都提出来吗
yyy000112 2016-06-20
  • 打赏
  • 举报
回复
引用 1 楼 shuijinglingsos 的回复:
你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
我试了一下在 saveDailyForecast方法里加上这段for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); } for (int i = 0; i < 7; i++) { DailyForecast dailyForecast = dailyForecasts.get(i); String date = dailyForecasts.get(i).getDate(); Astro astro = dailyForecasts.get(i).getAstro(); ....... saveDailyForecast...... SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext()); Log.d("Test", sp.getString("date_daily" + i, "")); 这样子可以把每个date都打印出来 } 当把SharedPreferences sp 这段拿到循环外时,我不管把I设定成多少数值,都只能打印出最后一个数据,也就是第七个
yyy000112 2016-06-20
  • 打赏
  • 举报
回复
引用 1 楼 shuijinglingsos 的回复:
你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);
editor.putString("date_daily_"+i, date); 这一段是不是要套一个循环 for(int I = 0; I<7;i++){ editor.putString("date_daily_"+i, date); }
睡精灵 2016-06-20
  • 打赏
  • 举报
回复
你这样往里面存储数据是不行的,最终保存的数据只有最后一条。你可以直接把json字符串保存进去,然后在读取,也可以使用索引,但是你的put的时候key要加上索引,比如:editor.putString("date_daily_"+i, date);

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧