0

データを保存する必要がなくなるまでの私のプロジェクトなので、データを保存するのはこれが初めてです。私がやろうとしているのは、クラスに基づく配列リストからデータを保存することです。私は何人かの人々がいくつかの異なる答えでこれを尋ねるのを見ました、しかし私は何かを逃しているようです。これは、私のすべての試みの後にコードが削除されたものです。誰かがこの情報を保存してロードするために何をすべきかについて私を助けてくれることを願っています。これはアプリのプロファイル保存であるため、ユーザーが選択した場合は複数のファイルが存在する可能性があることをほとんど忘れていました。

//in manifest
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

//in java file
private ArrayList<otherclass> otherClass=new ArrayList<otherclass>();
class saveData
{
        static private final int version=101002;
        private String title;
        private int[] Int1=new int[3];
        private int[] Int2=new int[3];
        private int[] Int3=new int[3];
        private int Int;
}
class otherclass
{
  //all the data goes here to similar named variables
}
4

2 に答える 2

2

1つの方法は、ArrayListに追加するクラスをシリアライズ可能に実装することです。クラスがシリアライズ可能も実装するオブジェクトのみで構成されている場合は、これで完了です(これはほとんどの場合です)。次のようにシリアライズ可能実装を追加するだけです。

 public class myClass implements Serializable {

それ以外の場合は、以下の2つのメソッドをクラスに追加する必要があります

 private void writeObject(java.io.ObjectOutputStream out) throws IOException 
 private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException

AddはSerialibleを実装し、ObjectOutStreamがデータをストレージ用にシリアル化できることを通知します。

次に、以下のメソッドを実装してデータを保存して開くことができます。各ステップの機能に関するコメントを参照してください...

void saveArray(String filename, ArrayList<myClass> arrayToSave) {
    FileOutputStream fos; //creates a file output stream to save your data
    ObjectOutputStream oos; //creates an object output stream to serialize your data
    try {
        fos = openFileOutput(filename, Context.MODE_PRIVATE); //creates and opens file with the specified filename, Context.MODE_PRIVATE limits its visibility to your app, other modes are available
        oos = new ObjectOutputStream(fos); //connects object output to file output
        oos.writeObject(arrayToSave); //writes the object to the file
    }
     catch (FileNotFoundException e) {
                        //handle file not found
    }
               catch (IOException e) {
    }
                        //handle I/O execption
               oos.close(); //close object output stream
               fos.close(); //close file output stream
}

ArrayList<myClass> openArray (String filename) {
    ArrayList<myClass> array = null; //create ArrayList
    FileInputStream fis; //create fileinput stream
    ObjectInputStream ois; //create objet input stream
    try {
        fis = openFileInput(filename); //open file stream
        ois = new ObjectInputStream(fis); //open object stream
        array = (ArrayList<myClass>)ois.readObject(); //create object from stream
    }
    catch (Exception e) {
        System.out.println(e.toString());
    }
              ois.close();  //close objectinput stream
              fis.close(); //close fileinput stream
    return array;
}

最後に、ファイルの入出力ストリームは両方ともbufferedinputstream / bufferedoutputストリームでラップできますが、小さなファイルではパフォーマンスにあまり影響しないことがわかりました。それはによって達成することができます

  BufferedInputStream bufIn = new BufferedInputStream(new FileInputStream("file.java"));
  BufferedOutputStream bufOut = new BufferedOutputStream(new FileInputStream("file.java"));

さて、以下はこれを実証するための完全なアクティビティファイルであり、バージョン2.1でテストされています...変更する必要があるのはプロジェクトに一致するパッケージ名だけです...これによりsaveDataの変数がからパッケージに変更されることに注意してくださいプライベート、プライベートにしておきたい場合は、おそらくそうすべきですが、セッター/ゲッターを実装する必要がありますが、以下のコードは、オブジェクトの保存/ロードを理解するのに役立ちます...

 package youpackage.name.myapp;

 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

class saveData implements Serializable {
    private static final long serialVersionUID = 1L;
    private final int version = 101002;
    String title;
    int[] Int1 = new int[3];
    int[] Int2 = new int[3];
    int[] Int3 = new int[3];
    int Int;
}

public class MyAppActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        System.out.println("This next line creates instance of class to save");
        saveData mySaveData = new saveData();
        System.out.println("This next line sets the title...");
        mySaveData.title = "accept my answer...";
        ArrayList<saveData> myArrayList = new ArrayList<saveData>();
        System.out.println("This next line adds the object to the ArrayList");

        myArrayList.add(mySaveData);
        System.out.println("This next line saves the arraylist");
    saveArray("myFilename", myArrayList);
    System.out.println("This next line loads the arraylist back...");

    ArrayList<saveData> retrieveArrayList = openArray("myFilename");
    if (retrieveArrayList.size() > 0) {
    saveData retrievedSaveData = retrieveArrayList.get(0);
    System.out.println("if successful, the title set above will appear...");

    System.out.println("if save/retrieve works, then " + retrievedSaveData.title);
    }
    else {
        System.out.println("it did not work");
    }
}

void saveArray(String filename, ArrayList<saveData> arrayToSave) {
    FileOutputStream fos;
    ObjectOutputStream oos;
    try {
        fos = openFileOutput(filename, Context.MODE_PRIVATE); 
        oos = new ObjectOutputStream(fos);
        oos.writeObject(arrayToSave); 
        oos.close();
        fos.close();
    } catch (Exception e) {
        System.out.println(e.toString());
    }

}

ArrayList<saveData> openArray (String filename) {
    ArrayList<saveData> array = null;   
FileInputStream fis;     
ObjectInputStream ois;   
try {         
    fis = openFileInput(filename);       
ois = new ObjectInputStream(fis);         
array = (ArrayList<saveData>)ois.readObject(); 
ois.close();               
fis.close();     
}     catch (Exception e) {         
    System.out.println(e.toString());    
    }               
return array; 
} 
 }

前回の投稿で述べたように、ロードと保存の以下の更新されたメソッドはパフォーマンスを向上させます...

void saveArray2(String filename, ArrayList<saveData> arrayToSave) {
    try {   
        BufferedOutputStream bos = new BufferedOutputStream(openFileOutput(filename, Context.MODE_PRIVATE),8000);
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(arrayToSave); 
        oos.close();
        } catch (Exception e) {
        System.out.println(e.toString());
    }

}

ArrayList<saveData> openArray2 (String filename) {
    ArrayList<saveData> array = null;   

try {  
      BufferedInputStream bufIn = new BufferedInputStream(openFileInput(filename),8000);
ObjectInputStream ois = new ObjectInputStream(bufIn);         
array = (ArrayList<saveData>)ois.readObject(); 
ois.close();               
}     catch (Exception e) {         
    System.out.println(e.toString()); 
}

return array; 
} 
于 2012-04-19T22:44:20.353 に答える
1

私はあなたのプライベートメンバーをパブリックメンバーに変更しました。値にゲッターとセッターが必要になることは望ましくありません。また、最終的な静的バージョンのメンバーに何が必要かわかりません...しかし、ここに良いアプローチがあります:

データを含むクラス

class otherClass {

    static private final int version=101002;
    public String title;
    public int[] Int1=new int[3];
    public int[] Int2=new int[3];
    public int[] Int3=new int[3];
    public int Int;
}

データを読み書きするクラス

class saveData {

    public boolean write(ArrayList<otherClass> list, String fileName) {

        try {

            FileutputStream fos = new FileOutputStream(fileName);
            DataOutputStream dos = new DataOutputStream(fos);

            final int length = list.size();
            for (int i = 0; i < length; i++) {

                otherClass item = list.get(i);
                dos.writeUTF(item.title);
                dos.writeInt(item.Int1[0]);
                dos.writeInt(item.Int1[1]);
                dos.writeInt(item.Int1[2]);
                dos.writeInt(item.Int2[0]);
                dos.writeInt(item.Int2[1]);
                dos.writeInt(item.Int2[2]);
                dos.writeInt(item.Int3[0]);
                dos.writeInt(item.Int3[1]);
                dos.writeInt(item.Int3[2]);
                dos.writeInt(item.Int);
            }

            dos.close();
            fos.close();

            return true;

        } catch (IOException e) {

            return false;
        }
    }

    public ArrayList<otherClass> read(String fileName) {

        try {

            FileInputStream fos = new FileInputStream(fileName):
            DataInputStream dis = new DataInputStream(fis);
            ArrayList<otherClass> list = new ArrayList<otherClass>();
            while (dis.available() > 0) {

                otherClass item = new otherClass();
                item.title = dis.readUTF();
                item.Int1[0] = dis.readInt();
                item.Int1[1] = dis.readInt();
                item.Int1[2] = dis.readInt();
                item.Int2[0] = dis.readInt();
                item.Int2[1] = dis.readInt();
                item.Int2[2] = dis.readInt();
                item.Int3[0] = dis.readInt();
                item.Int3[1] = dis.readInt();
                item.Int3[2] = dis.readInt();
                item.Int = dis.readInt();

                list.add(item);
            }

            return list;

        } catch (IOException e) {

            return null;
        }
    }
}

使用例

saveData.write(list, "someFile");
list = saveData.read("someFile");
于 2012-04-20T18:42:17.347 に答える