0

iPhoneアプリにSQLite(外部ライブラリなし)を使用しています。SQLiteテーブルに挿入する500行近くの巨大なデータ(Webサービスから取得されるため、sqliteマネージャーから手動で挿入することはできません)があります。ログを確認したところ、挿入は正常に実行されました。

if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)

ただし、挿入操作の途中でアプリを終了すると、一部の行のみが挿入されます。たとえば、200などです。したがって、挿入操作の途中でアプリケーションを終了したときに完全なロールバックを実行する方法はありますか?したがって、アプリケーションを再起動すると、200行しか読み取れません。

注:NSOperationQueueを使用しているため、挿入中にグリッチなしでアプリが実行されます(挿入全体で約20秒かかります)

SQLiteへの不完全な挿入を回避するためのこのケースのリファレンスチュートリアルはありますか?これにはトランザクションを使用する必要があるかもしれませんが、良い参照はありますか?

どんな助けでもいただければ幸いです。

4

2 に答える 2

1

トランザクションを開始して終了するだけです。単純なケース:

sqlite3_exec(database, "BEGIN", 0, 0, 0);

... (your insert code)

sqlite3_exec(database, "COMMIT", 0, 0, 0);
于 2012-08-01T23:40:15.660 に答える
1

ありがたいことに、私は抜け道を見つけました:

if ([db_handle openConnectionSucess]==1 && (sqlite3_exec(database, "BEGIN", 0, 0, 0))==SQLITE_OK) {  

      char *error;

         NSString *insertStatement = [NSString stringWithFormat:@"insert into StationTbl (id, name, address) VALUES (\"%@\", \"%@\", \"%f\", \"%f\")",id,name,value];
        if ( sqlite3_exec(database, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK)
        {


        }
        else
        {
            NSLog(@"Error: %s", error);
        }

      if(sqlite3_exec(database, "COMMIT", 0, 0, 0) ==SQLITE_OK){

      }
      else {
          sqlite3_exec(database, "ROLLBACK", 0, 0, 0);
      }
}

それは2つの目的を解決しています:

  1. 挿入は最大 3 秒で実行されます (トランザクションを使用せずに 25 秒までコンプとして)

  2. アプリが終了すると自動ロールバックされます。

投稿に尽力してくれたすべての人に感謝します!!

于 2012-08-02T14:30:46.280 に答える