2013-07-02 2 views
0

3 일 후, som help를 받으러 왔습니다. 내 응용 프로그램에서 SQLite 데이터베이스의 여러 열을 업데이트하고 싶습니다. 그래서 필요에 따라 여러 번 업데이트 메서드를 호출하는 "for"가 있어야합니다. 그러나 첫 번째 열만 영향을받습니다.iOS SQLite 업데이트 문제

for (NSDictionary *friend in friends) 
     { 
      NSMutableArray *valuesForUpdate = [[NSMutableArray alloc] init]; 
      DBHelper *dbHelper = [[DBHelper alloc] initWithPath:@"DB_CodiUp"]; 
      [valuesForUpdate addObject:[friend objectForKey:@"name"]]; 
      [valuesForUpdate addObject:[friend objectForKey:@"code"]]; 
      [valuesForUpdate addObject:[friend objectForKey:@"store"]]; 
      [valuesForUpdate addObject:[friend objectForKey:@"imgData"]]; 
      [dbHelper updateColumns:columnsToUpdate inTable:tableName withValues:valuesForUpdate where:@"id" isIqualsTo:[friend objectForKey:@"id"]]; 
     } 

그리고 내 업데이트 방법은 이것이다 : 같은 루프

내 보이는

- (BOOL) updateColumns:(NSArray *)columns inTable:(NSString *)tableName withValues:(NSArray *)values where:(NSString *)columnSelector isIqualsTo:(NSString *)selector 
{ 
sqlite3_stmt *statement; 
const char *sql; 
NSString *preSQL = [NSString stringWithFormat:@"Update %@ set ",tableName]; 

//Build sql 
for(int i = 0; i < [columns count]; i++){ 
    if(i == 0) 
     preSQL = [NSString stringWithFormat:@"%@ %@ = ?", preSQL,[columns objectAtIndex:i]]; 
    else 
     preSQL = [NSString stringWithFormat:@"%@ , %@ = ?", preSQL,[columns objectAtIndex:i]]; 
} 
preSQL = [NSString stringWithFormat:@"%@ where %@ = %@", preSQL, columnSelector, selector]; 
sql = [preSQL UTF8String]; 

//Prepare statement 
if(sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) 
{ 

    for(int i = 0; i < [values count]; i++){ 
     if([[values objectAtIndex:i] isKindOfClass:[NSString class]]) 
     { 
      sqlite3_bind_text(statement,i+1,[[values objectAtIndex:i] UTF8String], -1, SQLITE_TRANSIENT); 
     } 
     else if([[values objectAtIndex:i] isKindOfClass:[NSNumber class]]) 
     { 
      sqlite3_bind_int(statement, i+1, ((NSNumber *)[values objectAtIndex:i]).integerValue); 
     } 
     else if ([[values objectAtIndex:i] isKindOfClass:[NSData class]]) 
     { 
      sqlite3_bind_blob(statement, i+1, [[values objectAtIndex:i] bytes], [[values objectAtIndex:i] length], SQLITE_TRANSIENT); 
     } 
     else 
     { 
      NSLog(@"[SQLITE UPDATE] ERROR! The value at index %d is not a recognized data type", i); 
     } 
    } 

    //Execute statement 
    int success; 
    success = sqlite3_step(statement); 
    if (success != SQLITE_DONE) 
    { 
     NSLog(@"Error on step: %i",sqlite3_errcode(database)); 
    } 

    sqlite3_finalize(statement); 
    NSLog(@"[DataBase]Updated row"); 
    sqlite3_close(database); 
    return YES; 
} 
else 
{ 
    NSAssert1(0,@"Error: Failed to prepare statement with message %s '.", sqlite3_errmsg(database)); 
    return NO; 
}  
} 

방법은 오류가 발생하지 않습니다, 그것은 모든 것이 정상입니다 및 업데이트가 실행 된 것을 말한다. 그러나 해당 테이블에 SELECT *를 수행하면 첫 번째 행만 영향을받습니다. 제발, 제발, 코드를보고 나에게 무엇이 잘못되었는지 말해주십시오.

고맙습니다!

답변

0

updateColumns 함수 끝에 데이터베이스가 닫힙니다. 네가 다시 열어 보지 않는다. 루프에서 많은 쿼리를 수행하는 경우 루프 전에 열고 다음과 같이 닫고 싶을 수 있습니다.

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK){ 
    sqlite3_exec(database, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0); 
    for (NSDictionary *friend in friends) { 
     //perform update query 
    } 
    sqlite3_exec(database, "COMMIT TRANSACTION", 0, 0, 0); 
    sqlite3_close(database); 
} 
+0

같은 문제는 ...이 업데이트가 완벽하게 실행 된,하지만 난 선택, 첫 번째 행을 할 때 sqlite3_close (데이터베이스)를 제거 가정 –

+0

를 변경되었음을 말한다; updateColumns에서 sqlite3_finalize (문); 모든 준비 후 sqlite3_prepare_v2 (데이터베이스, SQL, -1, & 문, NULL). 나는 단지 로그 문을 넣거나 코드를 단계별로 실행하여 실제로 문이 예측대로 실행되는지 확인합니다. –