0

私がdb4oを使用している方法は、実際には読み取り専用です。私はアプリケーションと一緒にdbをパッケージ化し、それに対してバックグラウンド更新を時々行いますが、これは別の方法で処理できます。しかし、データベースからのデータを表示している私のアクティビティでは、更新を行う必要がないので、この理由で、データベースからデータを取得し、そのデータを「非アクティブ化」して、アクティビティが画面の向きが変わるなどの理由でconfigurationChangeを実行すると、アクティビティをすばやくレイアウトし直すことができます。オブジェクトを非アクティブ化して、アクティビティで引き続き使用できるようにする適切な方法は何ですか。現在、私は次のようなコードを持っています

List<MyObject> mList = db().queryByExample(persistentClass);  // db just gets my ObjectContainer

私はこのようなことをしてみました

db().ext().deactivate(mList);

しかし、それは機能していないようです。リストの各項目を繰り返し処理して非アクティブ化する必要がありますか?

Androidで画面の向きを変更すると、データベースを閉じるアクティビティの閉じるメソッドがヒットします。しかし、その後バックアップを開始し、mListに再度データを入力したくありません。

com.db4o.ext.DatabaseClosedExceptionアクティビティのレイアウトで次のようなことを行うため、「」例外が発生し続けます。

mList.size()

私は本当にオブジェクトを非アクティブ化したいだけですb/ciはそれらを更新する必要はありません、どうすればこれを行うことができますか?

4

1 に答える 1

4

まず、すべてのオブジェクトがロードされていることを確認する必要があります。db4oは遅延読み込みリストのみを返します。これは、オブジェクトにアクセスしたときにオブジェクトを読み込みます。実行中のデータベースを必要としない通常のリストにオブジェクトをコピーする必要があります。これは非常に簡単です。クエリの結果を新しい配列リストに渡すだけです。

 List<MyObject> mList = new ArrayList<MyObject>(db().queryByExample(persistentClass)); 

これで、DatabaseClosedExceptionが発生することはありません。

次に、db4oの「非アクティブ化」はまったく異なるものであることを付け加えたいと思います。それはアクティベーションメカニズムと関係があります。非アクティブ化は、アクティブ化の反対です。アクティベーションは、データベースからメモリへのオブジェクトにロードされます。非アクティブ化すると、メモリ内のオブジェクトがデータのない空の船体になります。明示的な非アクティブ化は、メモリを保護するための特別なシナリオでのみ役立ちます。

于 2011-01-14T13:45:46.160 に答える