【问题标题】:Write an ArrayList to SD-Card将 ArrayList 写入 SD 卡
【发布时间】:2013-01-13 15:23:28
【问题描述】:

当我的应用程序启动时,它会连接到数据库并以 XML 格式下载一些数据。这是布局:

<Customers>
  <Customer> 
    <name>...</name>
    ...
  </Customer>
   <Customer> 
    <name>...</name>
    ...
  </Customer>
  ...
</Customer>

我为每个客户创建一个 Customer 类的对象,并将其存储在 ArrayList 中。用户可以编辑和添加每个客户的一些数据,他们可以将其上传回服务器。

问题是我不知道在本地存储数据的最佳方式是什么,所以如果我的应用程序关闭或用户不再有互联网,他们将有一个备份。我现在将所有 Customer 对象转换回 XML,然后将其存储在 SD 卡上,但我认为这不是一个好的解决方案。每个客户有大约 40 个字符串、10 个整数和一些我必须存储的布尔值。有没有更好的方法在本地存储数据?

我发现some code 可以存储一个 ArrayList 但它不适用于自定义类。

编辑:我使用this tutorial 来解决我的问题。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.util.ArrayList;

import android.os.Environment;

public class SerializeData {
    public static byte[] serializeObject(Object o) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try {
            ObjectOutput out = new ObjectOutputStream(bos);
            out.writeObject(o);
            out.close();

            // Get the bytes of the serialized object
            byte[] buf = bos.toByteArray();

            return buf;
        } catch (IOException ioe) {
            CreateLog.addToLog(ioe.toString());
            return null;
        }
    }

    public static Object deserializeObject(byte[] b) {
        try {
            ObjectInputStream in = new ObjectInputStream(
                    new ByteArrayInputStream(b));
            Object object = in.readObject();
            in.close();

            return object;
        } catch (ClassNotFoundException cnfe) {
            CreateLog.addToLog(cnfe.toString());

            return null;
        } catch (IOException ioe) {
            CreateLog.addToLog(ioe.toString());

            return null;
        }
    }

    public static void saveData(){
        byte[] arrayData = SerializeData
                .serializeObject(MyTasks.allCustomers);

        BufferedOutputStream bos;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(
                    Environment.getExternalStorageDirectory()
                            + "/myprogram/myarray.txt"));
            bos.write(arrayData);
            bos.flush();
            bos.close();
        } catch (FileNotFoundException e) {
            CreateLog.addToLog(e.toString());
        } catch (IOException e) {
            CreateLog.addToLog(e.toString());
        }
    }

    public static ArrayList<Customer> getData(){
        File afile = new File(Environment.getExternalStorageDirectory()
                + "/myprogram/myarray.txt");
        int size = (int) afile.length();
        byte[] bytes = new byte[size];
        try {
            BufferedInputStream buf = new BufferedInputStream(new FileInputStream(afile));
            buf.read(bytes, 0, bytes.length);
            buf.close();
        } catch (FileNotFoundException e) {
            CreateLog.addToLog(e.toString());
        } catch (IOException e) {
            CreateLog.addToLog(e.toString());
        }

        return (ArrayList<Customer>) SerializeData.deserializeObject(bytes); 

    }
}

【问题讨论】:

  • "有没有更好的方法来本地存储数据?" - SQLite 数据库是我的首选。

标签: android arraylist data-storage


【解决方案1】:

据我了解,客户结构只能在本地读取和写入,也可以由相同或高度相关的程序读取和写入。对于这种情况,我认为Java序列化是合适的,因为它添加的代码很少。

让客户实现 Serializable(立即输入 serialVersionUID,以便您以后可以控制版本)。 ArrayList 已经是可序列化的。按照here 的说明获取文件名,并使用 ObjectInput/Output 流进行序列化。如果需要,您可以随时迁移到 XML/JSON。一个简单的“hello world”序列化示例可以在here找到。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2022-11-01
  • 2011-04-12
  • 2011-04-20
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多