12

デバイスのパフォーマンスの問題を調べるのにかなりの時間を費やしてきましたが、かなりの数のアプリがすべてデータベースの読み取り/書き込みを行っていることに気付きました..

Contacts API を使用して新しい連絡先とデータ行を挿入することから始めましたが、非常に遅くなりました。約 1500 行を挿入するのに 1 分 18 秒かかります (250 の生の連絡先と 1250 のデータ行)。

私は別のアプリでパフォーマンス挿入のために挿入ヘルパーを使用していたので、別の挿入メソッドを使用して別のデータベースに書き込むテストアプリを作成することにしました。

各データベースには 1 つのテーブルがあり、それぞれに 4 つの列があります: _ID、名前、時間、およびブロブ (すべて「文字列」型) - 連絡先プロバイダーがデータ列を定義するのと同じです。

_ID は自動インクリメント pk で、Name は同じもの '1234567890' を挿入するだけであり、time は現在のシステム時刻 (ミリ単位) であり、Blob は文字 'A' で構成される長さ 6400 の文字列です...

最初に一括挿入を確認しましたが、定義したすべての挿入をループするだけで、挿入を個別に実行するのと同じくらい遅くなります(またはパフォーマンスへの影響はごくわずかです)。

挿入を行うために 3 つの異なるメソッドをテストしました: ContentValues w/ db.insert メソッド: SQLiteStatement w/ statement.execute() (トランザクション内で実行)。トランザクション付きの SqliteInsertHelper。

いくつかのコードを提供できますが、InsertHelper から最高のパフォーマンスを得て、なぜ廃止されたのか疑問に思っています。

100 レコードを挿入する時間

何か案は?

4

3 に答える 3

7

InsertHelper が非推奨になった理由についての情報を得るのは、それを非推奨にする実際のコミットに行かなければ困難です。InsertHelper を廃止したエンジニアは、次の理由を挙げています。

このクラスは、SQLiteStatement よりも利点がなく、コードが複雑になり、エラーが発生しやすくなります。

InsertHelper から SQLiteStatement にリファクタリングした後、同意します。1 つの例外は、null セーフ バインディング関数です。InsertHelper は自動的に bindNull() を呼び出しますが、たとえば null 文字列を渡すと SQLiteStatement がクラッシュし、bindString() を呼び出す前に独自の null チェックを行う必要があります。

参照: https://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/

于 2015-10-09T23:45:53.207 に答える