2

タイトルにあるように、ormLiteを使用してDAOオブジェクトでqueryForAllを実行しているときにパフォーマンスの問題が発生しました(問題が発生した場合はAndroidを使用)。

私が実際に行っているのは、これを実行することだけです。

this.getHelper()。getActivityDao()。queryForAll(); (this.getHelper()は、OrmLiteSqliteOpenHelperクラスから拡張されているデータベースヘルパーを返します)

この1行の実行には実際には約14秒かかります...「Activity」エンティティは約80フィールドを取得し、queryForAllは74オブジェクトの長さの配列を返しますが、それでも-これは正常ではありませんね。

(私が使用しているカレンダーフィールドには、

@DatabaseField(dataType = DataType.SERIALIZABLE)

注釈、これがカレンダーフィールドに適切な注釈であるかどうか、またはパフォーマンスの問題が発生する可能性があるかどうかはわかりません...)

4

2 に答える 2

3

この 1 行を実行するには、実際には約 14 秒かかります...「Activity」エンティティには約 80 個のフィールドがあり、queryForAll は長さ 74 個のオブジェクトの配列を返しますが、それでも、これは正常ではありませんね。

ご想像のとおり、テーブルに多数のオブジェクトがある場合、または各オブジェクトに大量のデータがあるqueryForAll()場合を除き、Aに長い時間がかかることはありません。その場合、基本的にテーブル全体をダンプし、多数のオブジェクトを作成する必要があります。queryForAll()

より大きなクエリの場合、テーブル全体をダンプする代わりにイテレータを使用することをお勧めします:

http://ormlite.com/docs/iterator

たとえば、次のようにクエリ内のすべてのオブジェクトを実行できます。

// page through all of the accounts in the database
for (Account account : accountDao) {
   // do something with each account here
}
于 2012-09-27T17:03:53.947 に答える
1

問題のクラスには、ORM で自動的に更新する外部オブジェクトまたはコレクションがありますか? つまり、たとえば、注釈が付けられたメンバーforeignAutoRefresh = trueまたは注釈が付けられたコレクションを意味@ForeignCollectionField(eager = true)します。これらの注釈は、ユーザーに代わってより多くのクエリを実行します。

その場合、意図せずに思ったよりも多くのデータを引き戻してしまう可能性があります。その場合、queryRaw()必要なデータに対して手動で結合ステートメントを使用して記述します。

于 2012-09-27T17:09:50.203 に答える