0

こんにちは私のアプリでは、複数のフィールドを持つ単一のオブジェクトを保存する必要があります。現時点ではこのように保存されています

@Override
    public Object onRetainNonConfigurationInstance() {
        return UILApplication.advert;
    }

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Advert retainedAdvert = (Advert) getLastNonConfigurationInstance();
        if (retainedAdvert != null) {
            UILApplication.advert = retainedAdvert;
        }
}

UILApplication は広告を保持するためのシングルトンです。ときどき (カメラを呼び出すときによくあります) 広告オブジェクトがデフォルトに戻されます。だから私は、このオブジェクトをケップするための保存と効率的な方法について知りたいです。ファイルに保存/シリアル化するか、単一のレコードのデータベースを作成するのが賢明ですか、それとももっと良いことがありますか?

4

2 に答える 2

1

私の電卓から取られた:

@SuppressWarnings("unchecked")
private void loadState() {
    ObjectInputStream ois;
    try {
        ois = new ObjectInputStream(openFileInput(FILE_STATE));
        state = ((State) ois.readObject());
        ois.close();

        ois = new ObjectInputStream(openFileInput(FILE_HISTORY));
        historyListAdapter.setItems((List<String>) ois.readObject());
        ois.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        state = new State();
    } catch (IOException e) {
        e.printStackTrace();
        state = new State();
    } catch (ClassNotFoundException e) {
        Toast t = Toast.makeText(this, "Error parsing saved state",
                Toast.LENGTH_SHORT);
        t.show();
        state = new State();
    }
    setState(state);
}

private void saveState() {
    ObjectOutputStream oos;
    try {
        oos = new ObjectOutputStream(openFileOutput(FILE_STATE,
                Context.MODE_PRIVATE));
        oos.writeObject(state);
        oos.close();

        oos = new ObjectOutputStream(openFileOutput(FILE_HISTORY,
                Context.MODE_PRIVATE));
        oos.writeObject(historyListAdapter.getItems());
        oos.close();

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
protected void onPause() {
    saveState();
    super.onPause();
}

onCreate() で loadState() を呼び出します。

AndroidでJavaシリアル化を使用することはお勧めできませんが、エラーやバグはまったく発生しませんでした。性能にも問題ありません。

もちろん、アプリケーションに応じてエラー処理を微調整する必要があります。

于 2013-10-25T19:59:53.560 に答える
1

オブジェクトの大きさによって異なります。共有設定を試してください: http://developer.android.com/guide/topics/data/data-storage.html#pref

設定の組み合わせ、そこから入力/読み取る適切な場所、およびいくつかの静的initメソッドがあなたのために何かをすることができます.

それが役に立てば幸い。

于 2013-10-25T19:51:02.963 に答える