2

アプリケーションが起動すると、データベースに接続し、XML形式でデータをダウンロードします。レイアウトは次のとおりです。

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

Customer顧客ごとに、ArrayListに格納するクラスのオブジェクトを作成します。ユーザーは、各顧客のデータを編集および追加して、サーバーにアップロードして戻すことができます。

問題は、データをローカルに保存するための最良の方法がわからないことです。そのため、アプリケーションが閉じたり、ユーザーがインターネットを利用できなくなったりした場合に、バックアップが作成されます。今ではすべてのCustomerオブジェクトをXMLに変換してSDカードに保存していますが、これは良い解決策ではないと思います。各顧客には、約40の文字列、10の整数、およびいくつかのブール値を格納する必要があります。データをローカルに保存するためのより良い方法はありますか?

ArrayListを格納できるコードがいくつか見つかりましたが、カスタムクラスでは機能しません。

編集:このチュートリアルを使用して問題を修正しました。

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); 

    }
}
4

1 に答える 1

1

私が理解しているように、顧客構造はローカルでのみ、また同じまたは関連性の高いプログラムによってのみ読み取りおよび書き込みが行われます。このような状況では、コードをほとんど追加しないJavaシリアル化が適切だと思います。

お客様にSerializableを実装させます(後でバージョンを制御できるように、すぐにserialVersionUIDを入力します)。ArrayListはすでにSerializableです。ここで説明されているようにファイル名を取得し、ObjectInput/Outputストリームを使用してシリアル化します。必要に応じて、後でいつでもXML/JSONに移行できます。シリアル化の簡単な「HelloWorld」の例は、ここにあります。

于 2013-01-13T15:34:52.587 に答える