2012-06-05 169 views
0

我正在處理iOS 5上的sqlite數據庫。我的應用程序所做的是將文本字段中的字符串保存到數據庫中。當我運行的應用程序,它崩潰給這個警告:Thread1:程序接收到的信號「SIGBRT」

線程1:計劃接收信號 「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); 
} 
+0

「將其保存到數據庫」是指你直接調用SQLite還是使用CoreData?無論哪種情況,在保存點上看​​相關的代碼都會很有幫助。 – wadesworld

+0

我正在使用sqlite 3 @wadesworld。我已經多次檢查了代碼,但沒有提示: –

+1

您能否將堆棧跟蹤添加到問題中 – JeremyP

回答

1

這是不可能確切說出的事情在你的程序沒有更多的信息,但即中止()被調用最常見的原因是:

  1. 你將消息發送到一個Objective-C的對象不支持/實現該消息這將導致可怕的「無法識別的選擇發送到實例」錯誤。
  2. 你在某個地方有一個失敗的斷言。在定義宏NDEBUG的非調試版本中,標準庫宏assert(3)在斷言失敗時調用abort()。
  3. 你有一些內存跺腳/分配錯誤。當malloc/free檢測到損壞的堆時,可能會調用abort()。 這意味着:當內存已經完成時釋放內存,可能是通過向對象發送太多的釋放消息。另一件事是,你可能無法將對象連接到它的筆尖IBOutlet。除了報告的錯誤之外,您還沒有提供任何其他信息,因此我無法確定。

  4. 您正在拋出未捕獲的異常(C++異常或Objective-C異常)。

在幾乎所有情況下,調試控制檯會給你什麼導致中止()被調用多一點信息,所以總是一起來看看在那裏。

+0

調試控制檯告訴您存在斷言失敗,您能告訴我在這種情況下可能會出現什麼問題嗎? 'm使用ARC啓用,所以我沒有使用任何明確的版本或delloc等。你能指導我嗎? –

+0

請再次看看這個問題。我編輯它並做了一些修改。 –

0

可以發生在不同的條件下這SIGABRT錯誤,

像你試圖接近DB無需打開DB,或者嘗試寫一些價值DB,而無需打開DB

或者可能是幾個原因,所以在這裏發佈一些代碼。

+0

Ive編輯了這個問題,並且添加方法編譯器的代碼找到越野車。請指導我問題出在哪裏。謝謝。 –

+0

'const char * sql =「插入字符串(字符串)值(?)」;'什麼值會代替'(?)' – Krunal

+0

10你得到斷言失敗?在創建添加語句或插入數據時? – Krunal