0

1500レコードのテーブルを持つiOSアプリがあります。

私はFMDBを使用しており、次のフォームを呼び出しています。

FMDatabase *db = ...
[db executeQuery:@"select num from a where b = ?", 6];

テーブル「a」には「b」のインデックスがあります。

これはシミュレーターでは問題なく動作しますが、iPad1では非常に長い時間がかかります。アプリが強制終了されるまでメモリを消費します。Instrumentsは「sqlite3_prepare_v2」でスタックしていると言います。

元のクエリにも「orderby」句がありました。テストのために削除しました。where句を完全に削除することもできますが、それでもこのように動作します。

何が間違っているのでしょうか?

これが発生する前に、他のクエリが機能しています。以前に別のスレッドからデータベースにアクセスしましたが、他のスレッドからのアクセスはありません。ぶら下がっている取引があるかもしれないと思っていましたが、そうではありません。

4

2 に答える 2

0

私は問題を見つけたと思います。2 つのスレッドがあり、スレッドごとに FMDatabase オブジェクトがあります。私が信じているのは、トランザクションで最初のデータベース オブジェクトを使用して多くの行を挿入したことです。トランザクションをコミットしていないという論理エラーが発生しました。

最初のデータベース インスタンスにはこの大きな保留中のトランザクションがありましたが、2 番目のデータベース インスタンスの同じテーブルからすべてを選択しようとしています。

どうやらそれが原因だったようです。どうやらシミュレーターでは、それほど遅くはありませんでした。しかし、iPad1 で十分なメモリと時間を消費したため、アプリは強制終了されました。

于 2012-10-04T17:33:14.567 に答える
0

それで、結果をにフェッチしようとしていFMResultSetますか?

また、FMResultSetを使用している場合、次のように入力して結果セットを閉じています[rs close]か?

これらは考慮すべき重要な事項です。

于 2012-10-04T10:17:40.213 に答える