2013-05-24 3 views
1

SQLite 데이터베이스를 만들려고하지만 연락처 테이블에서 파생 된 것으로 보이는 문제가 발생했습니다 (필자는 '테이블을 삽입하는 동안 오류가 발생했습니다'라는 오류 메시지가 나타납니다 : CONTACTS ' ').SQLite 데이터베이스 테이블이 생성되지 않았습니다

아래 코드에서 누구나 무엇이 잘못되었고 어떻게 수정 될 수 있습니까? 이 예제는 내가 놀랐어요 왜 작동하지 않습니다이 가이드에서 바로 가져온 것입니다 http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_6_iPhone_Application

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *docsDir; 
    NSArray *dirPaths; 

    // Get the documents directory 

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = dirPaths[0]; 

    //Buid the path for database file 
    _databasePath = [[NSString alloc] 
        initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]]; 

    NSFileManager *filemgr = [NSFileManager defaultManager]; 

    if([filemgr fileExistsAtPath: _databasePath ] == NO) 
    { 
     const char *db_path = [_databasePath UTF8String]; 

     if(sqlite3_open(db_path, &_contactDB) == SQLITE_OK) 
     { 
      char *errMsg; 

      const char *sql_stmt = 
      "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)"; 

      if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
      { 
       _text.text = @"Failed to create table"; 
      } 
      sqlite3_close(_contactDB); 
     } else { 
      _text.text = @"Failed to open/create database"; 
     } 
    } 

} 

- (IBAction)saveName:(id)sender { 


NSString *currentName = self.text.text; 
NSString *nameSaved = [[NSString alloc] initWithFormat:currentName]; 


    sqlite3_stmt *statement; 
    const char *dbpath = [_databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &_contactDB) == SQLITE_OK) 
    { 
     NSLog(@"pass"); 
     NSString *insertSQL = [NSString stringWithFormat: 
           @"INSERT INTO CONTACTS (name) VALUES (\"%@\")", 
           nameSaved]; 

     const char *insert_stmt = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(_contactDB, insert_stmt, 
          -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
     NSLog(@"pass"); 
     } else { 
     NSLog(@"Error while inserting '%s'", sqlite3_errmsg(_contactDB)); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(_contactDB); 

    } 
} 
+0

이전에이 코드를 실행했지만 작성한 파일이 실패한 경우 db가 문서 폴더에 남아 있기 때문에 장치/시뮬레이터에서 앱을 제거하고 앱을 다시 실행할 수 있습니다. create table 문을 다시 누르십시오). – Rob

+0

다음 줄이 잘 보이지 않습니다. NSString * insertSQL = [NSString stringWithFormat : @ "INSERT INTO CONTACTS (name") VALUES (\ "% @ \") ", nameSaved] –

답변

0

- 그것은 Mac OS X과 iOS 시뮬레이터에서 잘 실행됩니다. 나중에 테이블에 데이터를 삽입하려고 할 때 오류가 발생합니까? 데이터를 삽입하기 전에 파일을 닫고 있습니까?

시뮬레이터에서 코드를 단계별로 실행 한 다음 시뮬레이터의 Documents 디렉토리에서 파일을 찾습니다.

sqlite3 "/Users/my-login-name/Library/Application Support/iPhone Simulator/6.1/Applications/DAD0BB47-2136-4367-8DAF-AA578D0C00A5/Documents/contacts.db" .dump 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT); 
COMMIT; 

당신은 테이블이 올바른 열이 존재하는 것을 볼 수 있습니다

sqlite3 path-to-file .dump 

정확한 경로가 나는 얻을 컴퓨터에하지만 내 아이폰 OS 시뮬레이터 다릅니다 : 터미널을 사용하여 파일에 무엇을 볼 수 .

+0

예, 테이블에 데이터를 삽입하려고하면 오류가 발생합니다 (위의 코드에서 saveName 메서드). 그래서 나는 그 오류가 어딘가에 있다고 생각합니다. 나는 그것이 무엇인지 모릅니다. – user1854291

+0

죄송합니다. 다른 루틴을 보지 못했습니다. 이 코드는 시뮬레이터 아래에서도 잘 실행됩니다. 데이터를 삽입하고 나중에 볼 수 있습니다. self.text.text에 추가 할 문자열이 포함되어 있습니까? 다른 것이 없다면 시뮬레이터에서 앱을 삭제하고 다시 시도하십시오. 아마도 Rob이 맞고 기존 파일이 어떤 이유로 유효하지 않을 수 있습니다. sqlite3 dump 명령을 사용하여 테이블 모양을 확인하십시오. – EricS

-1

사용 objectAtIndex을 : 그 코드 아무 문제가 없습니다

sqlite3* _contactDB; 
NSString *docsDir; 
NSArray *dirPaths; 

// Get the documents directory 

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
docsDir = [dirPaths objectAtIndex:0]; 

//Buid the path for database file 
    NSString * _databasePath = [[NSString alloc] 
        initWithString:[docsDir stringByAppendingPathComponent:@"contacts.db"]]; 

NSFileManager *filemgr = [NSFileManager defaultManager]; 

if([filemgr fileExistsAtPath: _databasePath ] == NO) 
{ 
    const char *db_path = [_databasePath UTF8String]; 

    if(sqlite3_open(db_path, &_contactDB) == SQLITE_OK) 
    { 
     char *errMsg; 

     const char *sql_stmt = 
     "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT)"; 

     if (sqlite3_exec(_contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
     { 
      NSLog(@"Failed to create table") ; 
     } 
     sqlite3_close(_contactDB); 
    } else { 
     NSLog(@"Failed to open/create database"); 
    } 
} 
+1

objectAtIndex를 사용할 수 있지만 Objective-C의 최신 버전에서는 [0] . – EricS

+0

왜 - ve 투표 코드가 정상적으로 작동합니까 (기본 sdk Mac osx 10.5) –

관련 문제