2012-07-05 4 views
0

내 앱에서 SQLite 데이터베이스를 사용하여 데이터를 저장하고 있습니다. 여기 샘플 코드 내 메인 클래스의 SQLite DB 테이블에 데이터 삽입

우리가 삽입 할 롤 번호가 이미있는 경우이 방법은 검사를위한

-(IBAction)insertButtonAction:(id)sender 
{ 
BOOL isRollNum; 
Database *db = [[Database alloc]init]; 
if ([rollNumberTxtFld.text length]>0) 
{ 
    isRollNum = [db checkForRollNumber:rollNumberTxtFld.text]; 
    if (isRollNum == YES) 
    { 
     UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Student with specified roll number already available" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
     [errorAlert show]; 
    } 
    else 
    { 
     if ([nameTxtFld.text length]>0 && [rollNumberTxtFld.text length]>0 ) 
     { 
      NSString *name = nameTxtFld.text; 
      NSString *num = rollNumberTxtFld.text; 
      int age = [ageTxtFld.text intValue]; 
      NSString *address1 = address1TxtFld.text; 
      NSString *address2 = address2TxtFld.text; 
      NSString *mobile = mobileTxtFld.text; 
      NSString *class =classTxtFld.text; 

      NSLog(@"%@ %@ %d %@ %@ %@ %@ ",name,num,age,address1,address2,mobile,class); 

      NSString* insert_stmt = NULL; 
      insert_stmt = [NSString stringWithFormat:@"insert into friends(name,rollnumber,age,address1,address2,mobile,class) values('%@', '%@', '%d', '%@', '%@', '%@', '%@')",name,num,age,address1,address2,mobile,class,nil ]; 
      Database *db = [[Database alloc]init]; 
      BOOL inserted = [db insertIntoDB:insert_stmt]; 
      if (inserted == YES) 
      { 
       insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Inserted" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
       [insertReenterAlert show]; 
      } 
      else 
      { 
       insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Failed" message:@"Not Inserted" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
       [insertReenterAlert show]; 
      } 
     } 
     else 
     { 
      insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@" Please enter required fields and try again." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [insertReenterAlert show]; 
     } 
    } 
} 
else 
{ 
    insertReenterAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@" Please enter required fields and try again." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
    [insertReenterAlert show]; 
} 
} 

을 다음과 같이 이러한 메서드를 호출하고 데이터

를 삽입하기 위해 사용하고있다 또는 DB 테이블에 없습니다.

-(BOOL)checkForRollNumber:(NSString *) num 
{ 
rollNumberArray = [[NSMutableArray alloc] init]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
dbPath = [[NSBundle mainBundle]pathForResource:@"FriendsList"ofType:@"sqlite"]; 
NSLog(@"dbPath %@",dbPath);  
BOOL success = [fileManager fileExistsAtPath:dbPath]; 
int rowCount = 0; 
if (success) 
{ 
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     const char* sqlStatement = "SELECT COUNT(rollnumber) FROM friends "; 
     sqlite3_stmt* statement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) 
     { 
      if(sqlite3_step(statement) == SQLITE_ROW) 
      rowCount = sqlite3_column_int(statement, 0); 
     } 
     else 
     { 
      NSLog(@"Failed from sqlite3_prepare_v2. Error is: %s", sqlite3_errmsg(database)); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(database); 
    } 
} 
NSLog(@"rowCount %d",rowCount); 
if (success) 
{ 
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     const char *selectSQL = "SELECT rollnumber FROM friends"; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, selectSQL, -1, &statement, NULL) == SQLITE_OK) 
     { 
      while (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       for (int i=0; i<rowCount; i++) 
       { 
        NSLog(@"i %d",i); 
        NSString *str = [NSString stringWithUTF8String:(char *) sqlite3_column_text(statement, 0)]; 
        [rollNumberArray addObject:str]; 
        NSLog(@"rollNumberArray: %@",[rollNumberArray objectAtIndex:i]); 
       } 
      } 
      for (int i=0; i<[rollNumberArray count]; i++) 
      { 
       NSLog(@"[rollNumberArray objectAtIndex:%d] %@ == num %@",i,[rollNumberArray objectAtIndex:i],num); 
       if ([[rollNumberArray objectAtIndex:i] intValue] == [num intValue]) 
       { 
        NSLog(@"FOUND"); 
        return YES; 
       } 
       else 
       { 
        NSLog(@"NOT FOUND"); 
        return NO; 
       } 
      } 
     } 
     else 
     { 
      NSLog(@"Statement Not Prepared"); 
      return NO; 
     } 
     sqlite3_finalize(statement); 
    } 
    else 
    { 
     NSLog(@"Database Not Opened"); 
     return NO; 
    } 
    sqlite3_close(database); 
} 
else 
{ 
    NSLog(@"File Not Opened"); 
    return NO; 
} 
} 

-(BOOL) insertIntoDB :(NSString *) insert_stmt 
{ 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
dbPath = [[NSBundle mainBundle]pathForResource:@"FriendsList"ofType:@"sqlite"]; 
NSLog(@"dbPath %@",dbPath);  
BOOL success = [fileManager fileExistsAtPath:dbPath]; 
if (success) 
{ 
    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) 
    { 
     const char *insertSQL = [insert_stmt UTF8String]; 
     sqlite3_stmt *statement; 
     if (sqlite3_prepare_v2(database, insertSQL, -1, &statement, NULL) == SQLITE_OK) //**Always not entering into this if** 
     { 
      if (sqlite3_step(statement) == SQLITE_DONE) 
      { 
       NSLog(@"Succesfully added in DB"); 
       return YES; 
      } 
      else 
      { 
       NSLog(@"Not added in DB"); 
       return NO; 
      } 
     } 
     else 
     { 
      NSLog(@"Statement Not Prepared"); 
      return NO; 
     } 
     sqlite3_finalize(statement); 
    } 
    else 
    { 
     NSLog(@"Database Not Opened"); 
     return NO; 
    } 
    sqlite3_close(database); 
} 
else 
{ 
    NSLog(@"File Not Opened"); 
    return NO; 
} 
} 

그것은 (베이스, selectSQL, -1, & 성명, NULL) == SQLITE_OK이 조건 sqlite3_prepare_v2 만족되지 않는 테이블에 데이터를 삽입하는 방법) 처음 값만 추가됩니다. 누구든지 나를 도울 수 있습니다.

미리 감사드립니다.

+0

NSLOG로 표시 할 DB의 경로를 확인하십시오. 맞습니까? –

+0

CoreData 사용을 고려하십니까? – Devraj

+0

그리고 준비가 실패하면 sqlite3_errmsg (database)는 무엇을보고합니까? – Rob

답변

0

sqlite3_prepare_v2는 무시하는 오류 코드를 반환합니다. if 문을 사용하여 테스트하기 전에 검사 할 수 있도록 변수에 할당하지 않는 이유는 무엇입니까?

int returnCode = sqlite3_prepare_v2(database, insertSQL, -1, &statement, NULL) 
if (returnCode == SQLITE_OK) // put a breakpoint here and look at return code. 
+0

그 중 하나를 확인하십시오 –

+0

하지만 무엇이 반환됩니까? 이 오류 코드는 준비가 실패한 이유를 알려줍니다. –

관련 문제