2012-09-27 5 views
2

SQL 래퍼 (FMDB)를 사용하여 테이블에서 업데이트를 시도합니다. 삽입 방법이 좋지 않으며 테이블에서 데이터를 업데이트하려고 할 때 문제가 발생합니다.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 DB 쿼리 : COMMIT TRANSACTION;" –

+1

문제의 원인이되는 코드를 게시 할 수 있습니까? –

2

업데이트 된 SQL을 NSString에 저장하여 NSLog에 출력하고 문제가 있는지 확인할 수 있습니다. 또한 FMDatabase 객체의 lastError 속성을 확인합니다. 0이 아닌 경우 동일한 객체의 lastErrorMessage 속성을 NSLog로 사용하여 FMDB에서 불만 사항을 확인합니다.

+0

(성공) { NSLog (@ "OK")의 경우; [db commit]; [db 닫기]; } –

관련 문제