2012-12-05 24 views
0

我有一個問題,我試圖插入數據從NSMutableArra y到我的數據庫。這是我到目前爲止:問題插入數據期間通過使用sqlite3在數據庫iPhone

- (void)insertList:(NSString*) strListName ArrayOfData:(NSMutableArray*) dataArray{ 
sqlite3 *database = nil; 
sqlite3_stmt *addStmt = nil; 

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"customlists.sqlite"]; 
if(sqlite3_open([defaultDBPath UTF8String], &database) == SQLITE_OK) 
{ 
    for (int i = 0; i < dataArray.count; i++) 
    { 
     PageData *pageDta = [PageData new]; 
     pageDta = [dataArray objectAtIndex:i]; 

     if(addStmt == nil) { 
      const char *sql = "insert into NewList(ListName, PageName, PageNumber, id) 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, [strListName UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 2, [pageDta.strNamebyFilter UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 3, [pageDta.strPageNuber UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_int(addStmt, 4, i); 

     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 
      sqlite3_last_insert_rowid(database); 

     //Reset the add statement. 
     sqlite3_reset(addStmt); 
    } 
} 
else 
{ 
    NSLog(@"Error while opening database '%s'", sqlite3_errmsg(database)); 
} 
sqlite3_close(database); 
} 

但是在調用此函數後,數據庫爲空。有人能幫我找到這個問題的原因和可能的補救措施嗎?

+0

有這麼多的代碼開始思考什麼問題是...也許你可以對它進行調試或減少如果你將這段代碼粘貼到stackoverflow中等待答案,你將不會得到太多的幫助......祝你好運! –

+0

你有沒有輸出Log?或者什麼都沒有發生? – Rudi

+0

其實函數成功運行,沒有錯誤,所以沒有什麼可調試的。 – Ted

回答

-1

改變這一行:

const char *sql = "insert into NewList(ListName, PageName, PageNumber, id) Values(?, ?, ?, ?)"; 

到:

NSString *insertSQL = [NSString stringWithFormat: @"NSString stringWithFormat: "INSERT INTO NewList(ListName, PageName, PageNumber, id) VALUES(\"%@\", \"%@\", \"%@\", \"%@\")" ,strListName, pageDta.strNamebyFilter, pageDta.strPageNuber, addStmt]; 

const char *sql = [insertSQL UTF8String]; 
+0

我有下一個錯誤:[49304:c07] ***斷言失敗 - [DBManager insertNewList:ArrayOfData:],/Users/admin/Documents/DBManager.m:85 – Ted

+0

這是創建一個更糟糕的方法請求參數。切勿爲此使用字符串格式。 – rmaddy

+0

你能否提供更好的方法? – Ted

0

主要的問題很簡單 - 你試圖寫於應用程序的包的數據庫。這是不允許的。應用程序的軟件包在真實設備上是隻讀的(儘管它可以在模擬器中寫入)。第一次運行應用程序時,正確的做法是將資源包中的數據庫複製到應用程序沙箱的可寫區域。然後每個數據庫的使用都通過副本完成。

for循環之前準備語句也會更清晰。無需繼續檢查是否已經設置每個循環迭代。

您打電話給sqlite3_last_insert_rowid,但不要對該值做任何事情。重點是什麼?

循環完成後,您從不確定語句。你需要這樣做。

當你完成後,你不關閉數據庫。

+0

我改寫了功能: – Ted

0

我已經重寫功能:

if(sqlite3_open([defaultDBPath UTF8String], &database) == SQLITE_OK) 
{ 
    for (int i = 0; i < dataArray.count; i++) 
    { 
     PageData *pageDta = [PageData new]; 
     pageDta = [dataArray objectAtIndex:i]; 

     if(addStmt == nil) { 
      const char *sql = [[NSString stringWithFormat:@"INSERT INTO NewList (ListName, PageName, PageNumber) values('%@', '%@', '%@')",strListName,pageDta.strNamebyFilter, pageDta.strPageNuber] UTF8String]; 

      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, [strListName UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 2, [pageDta.strNamebyFilter UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 3, [pageDta.strPageNuber UTF8String], -1, SQLITE_TRANSIENT); 

     if(SQLITE_DONE != sqlite3_step(addStmt)) 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 

     //Reset the add statement. 
     sqlite3_reset(addStmt); 
    } 
    sqlite3_finalize(addStmt); 
} 
else 
{ 
    NSLog(@"Error while opening database '%s'", sqlite3_errmsg(database)); 
} 
sqlite3_close(database); 

,但結果是一樣的:(

+0

您應該用這些信息更新了您的問題,而不是將它作爲答案發布。看起來你忽略了我的主要陳述 - 你不能寫入資源包中的數據庫。你沒有移動準備聲明。您的查詢字符串仍然不正確。你正試圖在不包含任何內容的查詢上調用'sqlite3_bind_text'?字符在裏面。您的原始查詢字符串是正確的。不要使用stringWithFormat來創建查詢。 – rmaddy