2012-03-23 4 views
1

아이폰 애플리케이션의 sqlite 데이터베이스에 데이터를 푸시 할 때 문제가 있습니다. 만들기가 정상으로아이폰 앱의 sqlite db 오류 : 해당 테이블이 없습니다

-(IBAction)createButtonPressed:(id)sender 
{ 
    NSLog(@"createButtonPressed: called"); 
    status.text=[status.text stringByAppendingString:@"create button pressed.\n"]; 
    NSString *docsDir; 
    NSArray *dirPaths; 

    // Get the documents directory 
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    docsDir = [dirPaths objectAtIndex:0]; 

    // Build the path to the database file 
    self.databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"database.sqlite"]]; 

    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if ([filemgr fileExistsAtPath: databasePath ] == NO) 
    { 
     status.text=[status.text stringByAppendingString:@"creating database... "]; 
     status.text=[status.text stringByAppendingFormat:@"path: %@\n\n", databasePath]; 

    const char *dbpath = [databasePath UTF8String]; 

     if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
     { 
      status.text=[status.text stringByAppendingString:@"database opened successfully\n"]; 

      char *errMsg; 
      const char *sql_stmt; 
      NSString *sqlStatement=[[NSString alloc] init]; 

      /* 
      CREATING JOB TABLE 
      */ 
      [email protected]""; 
      [sqlStatement stringByAppendingString:@"CREATE TABLE IF NOT EXISTS JOB "]; 
      [sqlStatement stringByAppendingString:@"(ID INTEGER PRIMARY KEY AUTOINCREMENT, "]; 
      [sqlStatement stringByAppendingString:@"NUMBER TEXT, "]; 
      [sqlStatement stringByAppendingString:@"DATE_LOADING INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"DATE_DEPARTURE INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"DATE_UNLOADING INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"ORIGIN INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"DESTINATION INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"SUPPLIER INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"RAILROAD INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"FOREMAN INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"WEATHER INTEGER, "]; 
      [sqlStatement stringByAppendingString:@"COMMENT TEXT, "]; 
      [sqlStatement stringByAppendingString:@"MODIFY_STATUS INTEGER)"]; 

      sql_stmt = [sqlStatement UTF8String]; 

      if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
      { 
       status.text=[status.text stringByAppendingString:@"failed to create JOB table\n"]; 
      } 
      else 
      { 
       status.text=[status.text stringByAppendingString:@"JOB table created\n"]; 
      }; 


     status.text=[status.text stringByAppendingString:@"closing database...\n"]; 
     sqlite3_close(database); 

    } 
    else 
    { 
     status.text=[status.text stringByAppendingString:@"failed to open/create database\n"]; 
    }; 
} 
else 
{ 
    status.text=[status.text stringByAppendingString:@"database exists "]; 
    status.text=[status.text stringByAppendingFormat:@"path: %@\n\n", databasePath]; 
}; 

[status scrollRangeToVisible:NSMakeRange([status.text length], 0)]; 

}

모든 것이 : 는 여기에 내가 데이터베이스를 만드는 방법은 다음과 같습니다. 하지만! 가 나는 오류가 내 테이블에 데이터를 밀어하려고하지 않을 때 : "그런 테이블 JOB" 밀어 데이터 코드 :

NSLog(@"populateButtonPressed: called"); 
status.text=[status.text stringByAppendingString:@"populate button pressed.\n"]; 

NSFileManager *filemgr = [NSFileManager defaultManager]; 

if ([filemgr fileExistsAtPath: databasePath ] == YES) 
{ 
    const char *dbpath = [databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &database) == SQLITE_OK) 
    { 
     status.text=[status.text stringByAppendingString:@"database opened successfully\n"]; 

     char *errMsg; 
     const char *sql_stmt; 
     NSString *sqlStatement=[[NSString alloc] init]; 

     /* 
     POPULATING JOB TABLE 
     */ 
     [email protected]"INSERT INTO JOB (NUMBER, DATE_LOADING, DATE_DEPARTURE, DATE_UNLOADING, ORIGIN, DESTINATION, SUPPLIER, RAILROAD, FOREMAN, WEATHER, COMMENT, MODIFY_STATUS) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

     sql_stmt = [sqlStatement UTF8String]; 
     sqlite3_stmt *stmt; 
     sqlite3_prepare_v2(database, sql_stmt, -1, &stmt, nil); 
     sqlite3_bind_text(stmt, 1, "number", -1, SQLITE_STATIC); //number 
     sqlite3_bind_int(stmt, 2, 100); //date_loading 
     sqlite3_bind_int(stmt, 3, 101); //date_departure 
     sqlite3_bind_int(stmt, 4, 102); //date_unloading 
     sqlite3_bind_int(stmt, 5, 103); //origin 
     sqlite3_bind_int(stmt, 6, 104); //destination 
     sqlite3_bind_int(stmt, 7, 105); //supplier 
     sqlite3_bind_int(stmt, 8, 106); //railroad 
     sqlite3_bind_int(stmt, 9, 107); //foreman 
     sqlite3_bind_int(stmt, 10, 108); //weather 
     sqlite3_bind_text(stmt, 11, "commentstring", -1, SQLITE_STATIC); //comment 
     sqlite3_bind_int(stmt, 12, 1); 

     if (sqlite3_step(stmt)!=SQLITE_DONE) 
     { 
      status.text=[status.text stringByAppendingString:@"WARNING!!! Could not step (execute) stmt\n"]; 
      status.text=[status.text stringByAppendingFormat:@"error: %@\n", [NSString stringWithUTF8String:sqlite3_errmsg(database)]]; 
     } 
     else 
     { 
      status.text=[status.text stringByAppendingString:@"it seems like stmt step (execute) was successfull"]; 
     }; 

     if(sqlite3_finalize(stmt)==SQLITE_DONE) 
     { 
      status.text=[status.text stringByAppendingString:@"finalizing stmt was successfull\n"]; 
     } 
     else 
     { 
      status.text=[status.text stringByAppendingString:@"WARNING!!! failed finalizing stmt\n"]; 
     }; 


     status.text=[status.text stringByAppendingString:@"closing database...\n"]; 
     sqlite3_close(database); 

    } 
    else 
    { 
     status.text=[status.text stringByAppendingString:@"failed to open database\n"]; 
    }; 
} 
else 
{ 
    status.text=[status.text stringByAppendingString:@"database does not exist. you need to create it.\n"]; 
}; 

[status scrollRangeToVisible:NSMakeRange([status.text length], 0)]; 

데이터베이스 경로에 존재하고 성공적으로 열립니다. iOS5 ipad 응용 프로그램, ARC를 사용하고 libsqlite3.dylib, 시뮬레이터에서 응용 프로그램을 실행하고 있습니다.

+0

'sqlite3_prepare_v2 (데이터베이스, SQL_stmt를, -1, stmt를, 전무),'바로이 행 후 나는 오류를 얻을 : "그런 테이블 작업을" – Oleg

답변

1

db 경로가 맞습니까? 왜 처음에 터미널을 체크인하지 않습니까?

> sqlite3 <your_db_path> 

> show tables; 
+0

'lifeinlagsworkstation : 문서 $ sqlite3를 database.sqlite SQLite는 lifeinlags 버전 3.6.12 지침으로 ".help"를 입력하십시오. ";"로 끝나는 SQL 문을 입력하십시오. sqlite> 테이블 표시 ...> – Oleg

+0

파일 database.sqlite가 있습니다. 하지만 테이블이없는 것처럼 보입니다. 왜? 내 코드가 뭐가 잘못 됐어? (당신은 내 질문 위에 테이블 코드를 만들 수 있습니다) – Oleg

+1

나는 그것을 의심합니다. 그럼, bit.ly/iUPld0에 2 분을 남겨 주시기 바랍니다. 나는 주위에 많은 SQL 래퍼 클래스가있는 곳에서 많은 고통을 안고있는 일반적인 sqlite3 원인을 사용하기 싫기 때문에 나는 모른다. bit.ly/GFOS1Q –

관련 문제