2012-09-27 46 views
2

我嘗試使用sql wrapper(FMDB)在表中進行更新。插入方法是oky,當我嘗試更新表中的數據時出現問題。iphone FMDB/SQLite更新查詢不起作用

- (void)saveUserMoneyValidation:(UserDebtInfo *)entities 
{ 
    NSLog(@"entities.client_index = %d", entities.client_index); 

    [self deleteUserMoneyValidation:entities.client_index]; 

    FMDatabase *newdb = [FMDatabase databaseWithPath:databasePathStore]; 

    [newdb setLogsErrors:TRUE]; 
    [newdb setTraceExecution:FALSE]; 

    if (![newdb open]) 
    { 
     NSLog(@"!!! Could not open db."); 
     return; 
    } 
    else 
    { 
     NSLog(@"DB Open successfuly."); 
    } 

    [newdb beginTransaction]; 
    NSLog(@"entities = %@",entities); 

    [newdb executeUpdate:@"INSERT INTO MoneyValidation (client_index, client_name, sum, duration, monthly_payment, payment_type, debt_type, debt_code, categoryType) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", 
    [NSNumber numberWithInt:entities.client_index], 
    entities.client_name, 
    entities.sum, 
    entities.duration, 
    entities.monthly_payment, 
    entities.payment_type, 
    entities.debt_type, 
    [NSNumber numberWithInt:entities.debt_code], 
    entities.categoryType 
    ]; 

    [newdb commit]; 
    [newdb close]; 
} 

更新方法:

-(void)updateUserMoneyValidation:(UserDebtInfo *)entities{ 
NSLog(@"entities.client_index = %d", entities.client_index); 

FMDatabase *newdb = [FMDatabase databaseWithPath:databasePathStore]; 

[newdb setLogsErrors:TRUE]; 
[newdb setTraceExecution:FALSE]; 

if (![newdb open]) 
{ 
    NSLog(@"!!! Could not open db."); 
    return; 
} 
else 
{ 
    NSLog(@"DB Open successfuly."); 
} 

BOOL success = NO; 

[newdb beginTransaction]; 
NSLog(@"entities = %@",entities); 

success = [newdb executeUpdate:@"UPDATE MoneyValidation SET client_name = ?, sum = ?, duration = ?, monthly_payment = ?, payment_type = ?, debt_type = ?, debt_code = ?, categoryType = ? WHERE client_index = %d;", entities.client_name, entities.sum, entities.duration, entities.duration, entities.monthly_payment, entities.payment_type, entities.debt_type, entities.debt_code, entities.categoryType, entities.client_index]; 

if (success) 
{ 
    NSLog(@"OK"); 
    [db commit]; 
    [db close]; 
} 
else 
{ 
    NSLog(@"FAIL"); 
} 

NSLog(@"OBJ - %@", entities);} 

表結構:

CREATE TABLE MoneyValidation (ID INTEGER PRIMARY KEY, client_index INTEGER, client_name TEXT, sum TEXT, duration TEXT, monthly_payment TEXT, payment_type TEXT, debt_type TEXT, debt_code INTEGER, categoryType TEXT) 
  • client_index是一個唯一的代碼;

    有人可以幫我提一些關於這個問題的建議嗎? 謝謝!

回答

3

我認爲問題在於你的更新聲明。所有傳遞到「executeUpdate」的值都應該是對象。

在您的更新SQL語句,entities.debt_codeentities.client_index正在爲整數過去了,你需要將它們傳遞作爲NSNumber的對象。

嘗試以下操作:

success = [newdb executeUpdate:@"UPDATE MoneyValidation 
      SET client_name = ?, sum = ?, 
      duration = ?, monthly_payment = ?, 
      payment_type = ?, debt_type = ?, 
      debt_code = ?, categoryType = ? 
      WHERE client_index = %d;", 

      entities.client_name, entities.sum, 
      entities.duration, entities.duration, 
      entities.monthly_payment, entities.payment_type, 
      entities.debt_type, 
      [NSNumber numberWithInt:entities.debt_code], // Convert int to object type 
      entities.categoryType, 
      [NSNumber numberWithInt:entities.client_index] // Convert int to object type 
      ]; 
+1

這個幫助嗎? –

+0

感謝您的回覆!遇到問題。你能幫助我嗎?錯誤:「更新OKy! 調用sqlite3_step時出錯(1:SQL邏輯錯誤或缺少數據庫)SQLITE_ERROR 數據庫查詢:COMMIT TRANSACTION;」 –

+1

你可以發佈導致問題的代碼嗎? –

2

把你的更新SQL放到NSString中,這樣你就可以在NSLog中輸出它,看看它是否有問題。還要檢查FMDatabase對象上的lastError屬性 - 如果它不是零,那麼NSLog會記錄同一對象的lastErrorMessage屬性,以查看FMDB抱怨的內容。

+0

如果(成功) { 的NSLog(@ 「OK」); [db commit]; [db close]; } –