2012-05-03 5 views
2

sqlite iPhone의 테이블에 데이터를 삽입하는 방법은 무엇입니까? 나는 또한 DB를 확인하기 위해 파이어 폭스 SQLite는 플러그인을 사용하고데이터를 SQLite db에 삽입하는 올바른 방법 iPhone

create table if not exists myDets (dets_id integer primary key asc, name text); 

: 나는 다음을 시도하지만 실패하고

:

NSString *query=[NSString stringWithFormat:@"insert into %@ (name) values ('%@')", table name,myName ]; 


sqlite3 *database; 

sqlite3_stmt *createStmt = nil; 

if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    if (createStmt == nil) { 

     if (sqlite3_prepare_v2(database, [query UTF8String], -1, &createStmt, NULL) != SQLITE_OK) { 
      return NO; 
     } 
     sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL); 
     return YES; 
    } 

    return YES; 
}else { 
    return NO; 
} 

내가 만든 테이블에 다음과 같은 방법으로한다. ? 내 DB에 파이어 폭스를 통해 레코드를 삽입하려고하면 그것은 나에게 다음과 같은 오류 제공 : 심하게 붙어

Failed to insert values 
Exception Name: NS_ERROR_STORAGE_IOERR 
Exception Message: Component returned failure code: 0x80630002 (NS_ERROR_STORAGE_IOERR)  [mozIStorageStatement.execute] 

:(또한

, 나는 그것이 문제가 않습니다, 아이폰 시뮬레이터에서이 작업을 실행하고를

. 사전에

답변

3
  • 를 사용하여 매개 변수를

    감사합니다 도움이되지 문자열 형식 귀하의 업데이트들 제발 tatement

  • 많은 추적을 추가하고, 리턴 코드를 확인하고, 오류 코드를 확인하십시오. (어떤 오류인지, 당신이 iPhone에서 부딪 치는 문제는 확실하지 않습니다.)
  • sqlite3_errmsg를 사용하여 오류 메시지를 받으십시오.
  • dbPath를 구성하고 로그 아웃하십시오. 에뮬레이터 아래의 터미널에서 db를 열 수 있는지 확인하십시오. sqlite가 수동으로 메모리에 데이터베이스를 생성한다는 것을 기억하십시오. 따라서 경로가 꺼져 있고 db가 존재하지 않는다면 혼란 스러울 수 있습니다.
  • 업데이트 문을 출력하고 로그인 한 경로의 터미널에있는 sqlite cmdline 앱에서 사용해보십시오.
  • db를 기본 번들 리소스에 넣는 경우 템플릿이며 템플릿을 열고 열고 쓰기 위해 복사해야합니다.

    샘플에서
    - (void)updateContact: (Contact*)contact error:(NSError**)error 
    { 
        if (![self ensureDatabaseOpen:error]) 
        { 
         return; 
        } 
    
        NSLog(@">> ContactManager::updateContact"); 
    
        // prep statement 
        sqlite3_stmt *statement; 
        NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?"; 
        NSLog(@"query: %@", querySQL); 
        const char *query_stmt = [querySQL UTF8String]; 
    
        // preparing a query compiles the query so it can be re-used. 
        sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);  
        sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC); 
        sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC); 
        sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC); 
        sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]); 
    
        NSLog(@"bind name: %@", [contact name]); 
        NSLog(@"bind address: %@", [contact address]); 
        NSLog(@"bind phone: %@", [contact phone]); 
        NSLog(@"bind int64: %qi", [[contact id] longLongValue]); 
    
        // process result 
        if (sqlite3_step(statement) != SQLITE_DONE) 
        { 
         NSLog(@"error: %s", sqlite3_errmsg(_contactDb)); 
        } 
    
        sqlite3_finalize(statement); 
    } 
    

    , DB를이 경로로 자원 복사 및 열 :

여기 내 샘플에서 업데이트 기능입니다. 여기에 열린 기능을 보장 나는 그렇게 사용하는 것 :

- (BOOL)ensureDatabaseOpen: (NSError **)error 
{ 
    // already created db connection 
    if (_contactDb != nil) 
    { 
     return YES; 
    } 

    NSLog(@">> ContactManager::ensureDatabaseOpen");  
    if (![self ensureDatabasePrepared:error]) 
    { 
     return NO; 
    } 

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK && 
     error != nil) 
    { 
     *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease]; 
     return NO; 
    } 

    NSLog(@"opened"); 

    return YES; 
} 

- (BOOL)ensureDatabasePrepared: (NSError **)error 
{ 
    // already prepared 
    if ((_dbPath != nil) && 
     ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath])) 
    { 
     return YES; 
    } 

    // db in main bundle - cant edit. copy to library if !exist 
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"]; 
    NSLog(@"%@", dbTemplatePath); 

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"]; 

    NSLog(@"dbPath: %@", _dbPath); 

    // copy db from template to library 
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath]) 
    { 
     NSLog(@"db not exists"); 
     NSError *error = nil; 
     if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error]) 
     { 
      return NO; 
     } 

     NSLog(@"copied"); 
    }  

    return YES;  
} 
+0

감사 bryanmac, 시도합니다 ... – iOSDev

+0

좋아! 그것은 나를 위해 너무 작동합니다. –

3
- (NSString *) getDBPath { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"iHadDB.sqlite"]; 
} 

- (void) insertValueToDatabase { 

    NSString *dbPath =[self getDBPath]; 

    NSString *select_Meal = dummy_select_Meal; 
    NSString *dateTime = dummy_date_Time; 
    NSString *location = dummy_location; 
    NSString *mealItem = dummy_mealItem; 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

     const char *sqlDB = "Insert into iHad(Mealtype,DateAndTime,Location,Mealitem) VALUES (?,?,?,?)"; 

     if(sqlite3_prepare_v2(database, sqlDB, -1, &addStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 

     sqlite3_bind_text(addStmt, 1, [select_Meal UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 2, [dateTime UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 3, [location UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(addStmt, 4, [mealItem UTF8String], -1, SQLITE_TRANSIENT); 

     if(SQLITE_DONE != sqlite3_step(addStmt)) 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
     //else 
      //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid 
      //coffeeID = sqlite3_last_insert_rowid(database); 

     //Reset the add statement. 
     sqlite3_reset(addStmt); 

    } 
    else 
     sqlite3_close(database); 

} 
관련 문제