Android保存多个对象

  • 在做Android开发的时候,有时候可能需要保存不同类中多个对象里封装好的数据,比如一个项目里面,既有书的类,书这个可以有很多不同的对象,还有学生的类,学生的类也可以创建出不同的对象,那么当有很多Activity都要用到这些数据的时候,最好可以把这些类的对象都保存起来。

  • 下面的代码就是如何保存一个类的对象

1.首先创建一个叫SaveObject的类。主要用它来序列化对象和方序列话对象。

  • 这个类也可以用来保存对象,我已经在写好了saveObject()和getObject(),但用起来很不方便,因为只能保存一个对象的数据。我希望的是像SharedPreferences这个类一样,通过键值对来进行对数据的保存和访问,这样就可以保存多个对象数据,只要你的key不一样就可以了。那么接下来再对数据进行进一步的封装。
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import android.content.Context;
import android.util.Base64;

public class SaveObject {

    private Context context;
    private final String name = "OBJECT_DATA";

    public SaveObject(Context context){
        this.context = context;
    }

    /**
     * 保存单个对象
     * @param object
     */
    public void saveObject(Object object){
        FileOutputStream stream;
        ObjectOutputStream oos;
        try {

            stream = context.openFileOutput(name, Context.MODE_PRIVATE);
            oos = new ObjectOutputStream(stream);  
            oos.writeObject(object);
            oos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }  



    }

    /**
     * 取得单个对象
     * @return
     */
    public Object getObject(){

        FileInputStream stream;
        Object obj = null;

        try {

            stream = context.openFileInput(name);
            ObjectInputStream ois = new ObjectInputStream(stream);  
            obj = ois.readObject();  
            ois.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (StreamCorruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return obj;  

    }

    /**
     * 序列化对象
     */
    public String serialize(Object object) throws IOException {

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(object);
        String serializeString = new String(Base64.encode(
        byteArrayOutputStream.toByteArray(), Base64.DEFAULT));

        objectOutputStream.close();
        byteArrayOutputStream.close();

        return serializeString;
    }

    /**
     * 反序列化对象
     */
    public Object UnSerialize(String str) throws IOException,ClassNotFoundException {

        byte[] mobileBytes = Base64.decode(str.getBytes(),
                Base64.DEFAULT);

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
        Object object = objectInputStream.readObject();
        objectInputStream.close();
        byteArrayInputStream.close();

        return object;
    }
}

2.首先创建一个叫SharedPreferencesDatat的类,保存多个数据对象。

  • 因为有了前面的SaveObject类中的序列化对象和反序列化对象,我们就可以用SharedPreferences 来保存对象数据了。在这个类里面我也写了一些基本数据的保存方法。
import java.io.IOException;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

/**
 * 保存轻量级数据的类
 * @author Lenovo
 *
 */
public class SharedPreferencesData {

    private String saveName = "MY_DATA";
    private Editor editor;
    private SharedPreferences sharedPreferences;
    private SaveObject saveObject;

    public SharedPreferencesData(Context context){

        editor = context.getSharedPreferences(saveName, Context.MODE_PRIVATE).edit();
        sharedPreferences = context.getSharedPreferences(saveName, Context.MODE_PRIVATE);

        saveObject = new SaveObject(context);

    }

    public Editor putString(String key, String value) {

        editor.putString(key, value);

        return editor;
    }

    public Editor putInt(String key, int value) {

        editor.putInt(key, value);

        return editor;
    }

    public Editor putBoolean(String key, boolean value) {

        editor.putBoolean(key, value);

        return editor;
    }

    public Editor remove(String key) {

        editor.remove(key);

        return editor;
    }

    public Editor clear() {

        editor.clear();

        return editor;
    }

    public Editor commit() {

        editor.commit();

        return editor;
    }

    public String getString(String key, String defValue) {

        return sharedPreferences.getString(key, defValue);
    }


    public int getInt(String key, int defValue) {

        return sharedPreferences.getInt(key, defValue);
    }

    public boolean getBoolean(String key, boolean defValue) {

        return sharedPreferences.getBoolean(key, defValue);
    }

    /**
     * 自定义保存对象
     * @param key
     * @param object
     */
    public void putObject(String key,Object object){
        try {
            this.putString(key, saveObject.serialize(object));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 自定义取得对象
     * @param key
     * @param defValeObject
     * @return
     */
    public Object getObject(String key,Object defValeObject){

        Object object = null;

        try {
                object =   saveObject.UnSerialize(this.getString(key,(String)defValeObject));
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return object;

    }
}

注意:你要保存的对象一定要是继承了Serializable接口,告诉系统这是一个被序列化的类,不然会报错(例如:public class Human implements Serializable)

到这里,就可以用SharedPreferencesData类中的putObject()和getObject()方法来保存多个对象和获取多个对象的数据了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值