2

だから、私はインターネットで見つけたすべての投稿を読みましたが、まだこれを機能させることができないようです.

大量のデータを sqlite データベースに挿入しようとしています。20000 行のデータなので、バックグラウンド スレッドで実行する必要があります。

データベース操作を処理するための NSObject .h および .m ファイルがあります。そして、メイン ビュー内からそれらを呼び出します。

これが私のコードです:

SQLiteDBHandler.m :

 database = [FMDatabase databaseWithPath:[self getDBPath]];
    [database open];
    dispatch_queue_t q = dispatch_queue_create("FMDBQueue", NULL);
    dispatch_async(q, ^{
        for(Customer *c in arrayOfObjects) {
            [database executeUpdate:@"INSERT INTO SNP(rdis, Position, FirstName, LastName) VALUES (?,?,?,?)", c.ID, c.Position, c.FirstName, c.LastName];
        }
        [database close];
    });

メイン ビューでメソッドを呼び出すには、次のように呼び出します。

SQLiteDBHandler *dbHandler = [[SQLiteDBHandler alloc]init];

[dbHandler insertDataIntoTable:mutableArray];

FMDatabaseQueue で FMDatabase を変更しようとしましたが、うまくいきませんでした。私はこれでかなり必死なので、どんな助けも大歓迎です。

ありがとう。乾杯!

4

2 に答える 2

1

2 回呼び出すInsertDataIntoTableか、データベースにアクセスしようとする他のメソッドを呼び出すと、クエリを実行する前にデータベース接続が閉じられる状況が発生する可能性があります。次のシナリオを検討してください。

  1. スレッド 1 はデータベース接続を開きます
  2. スレッド 2 はデータベース接続を開きます
  3. スレッド 1 はキューにブロックを追加します
  4. スレッド 2 はキューにブロックを追加します
  5. スレッド 1 の実行が終了し、db 接続が閉じられます
  6. スレッド 2 は彼のブロックを実行しようとしますが、db 接続は既に閉じられています。

[database open]ブロック内で呼び出してみてください。

于 2013-03-19T11:38:51.930 に答える
0

EXC_BAD_ACCESS は、ゾンビがあり、ゾンビ オブジェクトを有効にし、インストゥルメント ツールを使用することを意味します。ゾンビ オブジェクトの場所が表示されます。このリンクは、それらを検出する方法に関する優れたチュートリアルです

http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial

それが役立つことを願っています

編集:

xCode では、画面の上部にあるツールバーの [Product] -> [Edit Scheme] -> [Diagnostics] -> [Enable Zombie Objects] をクリックします。

次に、画面上部のツールバーで製品を選択し、プロファイルに移動すると、楽器が表示され、ゾンビのオプションが表示されるはずです。それを選択します。

編集2:

言い忘れましたが、ゾンビ テンプレートはシミュレーターでプロファイリングした場合にのみ表示され、実際のデバイスでプロファイリングを試みても表示されません。

Edit3: 写真

ここに画像の説明を入力

次に、これを見る必要があります

ここに画像の説明を入力

次に、アプリを実行すると、エラーが発生した画面に移動すると、アプリが停止し、これが表示されます

ここに画像の説明を入力

エラー メッセージの横にある矢印をクリックすると、エラーが発生しているスタック トレースに表示されます。

于 2013-03-19T09:27:53.183 に答える