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()方法传出数据. ...
随机推荐
- Linux学习笔记总结--云服务器挂载磁盘
1.通过 "fdisk -l" 命令查看 若执行fdisk -l命令,发现没有 /dev/xvdb 表明云服务无数据盘 2. 对数据盘进行分区 执行"fdisk /de ...
- git提交时的冲突处理
转自http://www.cnblogs.com/mengdd/p/3585038.html 当两条分支对同一个文件的同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称之为冲突(co ...
- Android开发进阶:如何读写Android文件
Android主要有四大主要组件组成:Activity.ContentProvider.Service.Intent组成.Android文件的运行主要需要读写四大组件的文件.本文将介绍如何读写Andr ...
- Unity3D中读取CSV文件
直接上代码 Part1: using UnityEngine; using System.IO; using System.Collections.Generic; public class CSV ...
- DataDictionaryTool 一款生成数据库字典工具支持mysql和oracle
因为常常查看mysql数据结构,频繁操作.很不爽,于是想把数据表制作成数据字典,于是网上搜的一款工具 DataDictionaryTool ,最终制作成功,分享给大家! 1,此工具需要安装jre ,简 ...
- asp.net mvc5 设置Area下的为启动页
只需修改App_Start文件夹下RouteConfig中RegisterRoutes方法 public static void RegisterRoutes(RouteCollection rout ...
- shell脚本学习之Bash shell 里各种括号的用法
今天在 SegmentFault 上看到又有人问起关于Shell里各种括号的问题.对于很多玩Shell的人,括号是个很尴尬的问题,用起来没问题,说起来不明白,我在这里总结一下Bash Shell几种括 ...
- mysql5.5提示Deprecated: mysql_query(): The mysql extension is deprecated
解决方法1:在php程序代码里面设置报警级别 <?php error_reporting = E_ALL & ~E_DEPRECATED 方法2:禁止php报错 display_erro ...
- C#后台程序与HTML页面中JS方法互调
此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中 ...
- HTML5 自适应rem布局
(function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...