0

私はios 5でsqliteデータベースに取り組んでいます。私のアプリケーションが行うことは、テキストフィールドに文字列を取り、それをデータベースに保存することです。アプリを実行すると、次の警告が表示されてクラッシュします。

Thread1: プログラム受信シグナル「SIGBRT」

これは、main.m と次の行で提供されます。

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

誰でも私を助けることができますか?それは非常に高く評価されます! :(私はxcode 4.2を使用しています。

アサーション エラーが発生したことをコンパイラが通知するメソッドを次に示します。

- (void) addstrings{    
    if(addStmt == nil) {
    const char *sql = "insert into strings(strings) Values(?)";
    if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
        NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStmt, 1, [strings UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        strID = sqlite3_last_insert_rowid(database);

    //Reset the add statement.
    sqlite3_reset(addStmt);
}
4

2 に答える 2

1

詳細な情報がなければ、プログラムで何が起こっているのかを正確に知ることはできませんが、abort() が呼び出される最も一般的な理由は次のとおりです。

  1. そのメッセージをサポート/実装していないObjective-Cオブジェクトにメッセージを送信します。これにより、恐ろしい「認識されないセレクターがインスタンスに送信されました」というエラーが発生します。
  2. どこかでアサーションが失敗しています。マクロ NDEBUG を定義する非デバッグ ビルドでは、アサーションが失敗すると、標準ライブラリ マクロ assert(3) が abort() を呼び出します。
  3. メモリストンピング/割り当てエラーがあります。malloc/free が破損したヒープを検出すると、abort() が呼び出される場合があります。つまり、おそらくオブジェクトにあまりにも多くの解放メッセージを送信することによって、既に行われているメモリを解放しています。もう 1 つの問題は、ペン先でオブジェクトをその IBOutlet に接続できなかった可能性があることです。報告されたエラー以外の情報を提供していないため、実際にはわかりません。

  4. キャッチされていない例外 (C++ 例外または Objective-C 例外) をスローしています。

ほとんどの場合、デバッグ コンソールは、abort() が呼び出される原因についてもう少し詳しい情報を提供するので、常にそこを確認してください。

于 2012-06-05T22:34:02.300 に答える
0

このSIGABRTエラーは、さまざまな状況で発生する可能性があります。

DBを開かずに閉じようとしているように、またはを開かずにDB値を書き込もうとしているように。DBDB

またはいくつかの理由があるかもしれないので、ここにコードを投稿してください。

于 2012-06-06T09:20:06.847 に答える