Android中SharedPreferences和序列化结合保存对象数据
前言:
最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页时,还能查看和修改。刚开始解决这个问题我们一定会从数据的大小的角度来解决,于是就有以下几种方式:
A、运用临时静态变量static来保存到内存中
B、运用SharedPreferences来保存
C、运用SQLite数据库
先来分析一下这个3种方式的优缺点, A、优点:用着随心所欲 缺点:当用户的手机有很多数据的时候,容易造成static丢失。
B、众所周知,SharedPreferences是Android平台上一个轻量级的存储类,它提供了Android平台常规的Long长
整形、Int整形、String字符串型的保存方式。对于我来说,这么多表单的数据,我可不想一个set进去(我实在是太懒了),于是把他放在一旁。C、使用SQLite数据库,这个未免就有点拿大炮打小鸟,大材小用了,因此果断放弃。
现在切入咱们的正题,由于表单的数据,一般都是一个实体类,可以进行序列化的,序列化本身的目的是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。说白了,最终就是转换成了二进制数据,
现在就引出我的思路,
1.类对象
2.序列化
3.得到字符串数据
4.存储(android五种存储方式)
5.按照存储方式来获取数据
6.反序列化
7.得到相应的对象
|
下面贴出代码:
Person.java
- package com.example.shareddatatest;
- import java.io.Serializable;
- public class Person implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- String name;
- int age;
- String address;
- String education;
- String tel;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getEducation() {
- return education;
- }
- public void setEducation(String education) {
- this.education = education;
- }
- public String getTel() {
- return tel;
- }
- public void setTel(String tel) {
- this.tel = tel;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getSex() {
- return sex;
- }
- public void setSex(String sex) {
- this.sex = sex;
- }
- String sex;
- @Override
- public String toString() {
- return "Person [name=" + name + ", age=" + age + ", address=" + address
- + ", education=" + education + ", tel=" + tel + ", sex=" + sex
- + "]";
- }
- }
MainActivity.java
- package com.example.shareddatatest;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.util.HashMap;
- import java.util.List;
- import android.app.Activity;
- import android.content.SharedPreferences;
- import android.content.SharedPreferences.Editor;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Menu;
- import android.view.View;
- public class MainActivity extends Activity {
- Person person = null;
- long startTime = 0l;
- long endTime = 0l;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- person = new Person();
- person.setName("LULU");
- person.setSex("bitch");
- person.setAddress("北京海淀");
- person.setAge();
- person.setTel("");
- person.setEducation("小学");
- }
- /**
- * 序列化对象
- *
- * @param person
- * @return
- * @throws IOException
- */
- private String serialize(Person person) throws IOException {
- startTime = System.currentTimeMillis();
- ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(
- byteArrayOutputStream);
- objectOutputStream.writeObject(person);
- String serStr = byteArrayOutputStream.toString("ISO-8859-1");
- serStr = java.net.URLEncoder.encode(serStr, "UTF-8");
- objectOutputStream.close();
- byteArrayOutputStream.close();
- Log.d("serial", "serialize str =" + serStr);
- endTime = System.currentTimeMillis();
- Log.d("serial", "序列化耗时为:" + (endTime - startTime));
- return serStr;
- }
- /**
- * 反序列化对象
- *
- * @param str
- * @return
- * @throws IOException
- * @throws ClassNotFoundException
- */
- private Person deSerialization(String str) throws IOException,
- ClassNotFoundException {
- startTime = System.currentTimeMillis();
- String redStr = java.net.URLDecoder.decode(str, "UTF-8");
- ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
- redStr.getBytes("ISO-8859-1"));
- ObjectInputStream objectInputStream = new ObjectInputStream(
- byteArrayInputStream);
- Person person = (Person) objectInputStream.readObject();
- objectInputStream.close();
- byteArrayInputStream.close();
- endTime = System.currentTimeMillis();
- Log.d("serial", "反序列化耗时为:" + (endTime - startTime));
- return person;
- }
- void saveObject(String strObject) {
- SharedPreferences sp = getSharedPreferences("person", );
- Editor edit = sp.edit();
- edit.putString("person", strObject);
- edit.commit();
- }
- String getObject() {
- SharedPreferences sp = getSharedPreferences("person", );
- return sp.getString("person", null);
- }
- public void onclick(View v) {
- switch (v.getId()) {
- case R.id.button1:
- try {
- saveObject(serialize(person));
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- break;
- case R.id.button2:
- try {
- Person person = deSerialization(getObject());
- Log.d("serial", person.toString());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- break;
- default:
- break;
- }
- }
- }
logcat的结果为:
Android中SharedPreferences和序列化结合保存对象数据的更多相关文章
- android中sharedPreferences的用法
SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...
- android中sharedPreferences的用法(转)
SharedPreferences介绍: 做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等 ...
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片 Android6.0中把Apache HTTP Client全部的包与类都标记为deprecated ...
- 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache
Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...
- android中SharedPreferences
SharedPreferences:用于存储少量并且数据格式简单,基本上都是普通的字符串,标量类型的值,比如:应用程序的各种配置信息等. SharedPreferences:保存的数据格式主要是key ...
- android中SharedPreferences 读取不到数据的问题
在两个不同的 Activity中,A中SharedPreferences保存了数据,在A中可以读取到,但是在 B中却读取不到了,一直是空值,好是不爽,由于是按照书本上的例子写的, 怎么也找不到原因,后 ...
- 【转载】如何在Android中避免创建不必要的对象
在编程开发中,内存的占用是我们经常要面对的现实,通常的内存调优的方向就是尽量减少内存的占用.这其中避免创建不必要的对象是一项重要的方面. Android设备不像PC那样有着足够大的内存,而且单个App ...
- android中使用Intent在activity之间传递数据
android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...
- android中使用intent来实现Activity带数据跳转
大家都知道startActivity()是用来切换跳转Activity的.如果想要在另个Activity中出书数据的话.只需要在源activity中使用intent.putExtra()方法传出数据. ...
随机推荐
- OC协议
概念:定义了一个接口,其他类负责来实现这些接口.如果你的类实现了一个协议的方法时,则说该类遵循此协议. 非正式协议:非正式协议虽名为协议,但实际上是挂于NSObject上的未实现分类(Unimplem ...
- Ⅵ.AngularJS的点点滴滴-- 指令
指令 基本用法 <html> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.2/angul ...
- linux vncserver配置
需要使用Linux的远程桌面服务,xmanager之前用过,感觉一般,这次尝试下vnc 我的操作系统是centos7 一服务端 安装VNCServer #yum -y install vnc *vnc ...
- 复旦大学2016--2017学年第一学期高等代数I期末考试情况分析
一.期末考试成绩班级前十名 宁盛臻(100).朱民哲(92).徐钰伦(86).范凌虎(85).沈伊南(84).何陶然(84).丁知愚(83).焦思邈(83).董瀚泽(82).钱信(81) 二.总成绩计 ...
- C# 事件的理解
说实话,事件弄得还是很晕,有待于以后的强化吧,下面是我对事件的一点理解 首先,参见大牛的帖子:网上大牛事件讲解 下面我来说一说事件的大致流程: 事件委托事件概述事件就是当对象或类状态发生改变时,对象或 ...
- Java 之文件IO编程 之读取
package com.sun; /* * 这里是对文件IO流读取的操作 * 2014-08-10 */ import java.io.*; public class File_test { publ ...
- Java SE (6)之 多线程
package com.sunzhiyan03; /* * 演示多线程 * */ public class Demo3 { public Demo3() { // TODO Auto-generate ...
- 在Abp框架中使用Mysql数据库的方法以及相关问题小记
最近发现了一款DDD的框架 看起来不错,据说挺流弊的 刚好最近要弄点小东西,拿来试试也不错 苦于穷逼买不起高配服务器,只好装mysql数据库了 下面说下如何在该框架下使用Mysql数据库 打开项目后, ...
- 收集SQLServer线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- CSS 背景
CSS 背景属性用于定义HTML元素的背景. CSS 属性定义背影效果: background-color background-image background-repeat background- ...