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(20);
        person.setTel("1231312");
        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", 0);
        Editor edit = sp.edit();
        edit.putString("person", strObject);
        edit.commit();
    }

    String getObject() {
        SharedPreferences sp = getSharedPreferences("person", 0);
        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的結果為:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM