2010-03-07 2 views
0

나는보고있는 시간을 보냈지 만 해결할 수 없다는 정말 실망스러운 오류가 있습니다. 내 DB에서이 코드 아무 문제 데이터를 얻을 수 있지만, 삽입 또는 갱신은 나에게 이러한 오류 제공 :iPhone에서 sqlite 데이터베이스에 (INSERT, UPDATE) 쓰기를 시도 할 때 어설 션 오류가 발생했습니다.


    [Functions db_insert_answer:[[dict_question objectForKey:@"JISDec"] intValue] question_type:@"kanji_meaning" score:arc4random() % 100]; 

    //update EF, Next_question, n here 
    [Functions db_update_EF:[dict_question objectForKey:@"question"] EF:EF]; 

이 함수를 호출하기 : 여기


*** Assertion failure in +[Functions db_insert_answer:question_type:score:], /Volumes/Xcode/Kanji/Classes/Functions.m:129 

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error inserting: db_insert_answer:question_type:score:' 

은 내가 사용 코드입니다 :



+(sqlite3_stmt *)db_query:(NSString *)queryText{ 
    sqlite3 *database = [self get_db]; 
     sqlite3_stmt *statement; 
    NSLog(queryText); 
    if (sqlite3_prepare_v2(database, [queryText UTF8String], -1, &statement, nil) == SQLITE_OK) { 
    } else { 
     NSLog(@"HMM, COULDNT RUN QUERY: %s\n", sqlite3_errmsg(database)); 
    } 
    sqlite3_close(database); 
    return statement; 
} 
+(void)db_insert_answer:(int)obj_id question_type:(NSString *)question_type score:(int)score{ 
    sqlite3 *database = [self get_db]; 
     sqlite3_stmt *statement; 
    char *errorMsg; 
    char *update = "INSERT INTO Answers (obj_id, question_type, score, date) VALUES (?, ?, ?, DATE())"; 
    if (sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK) { 
     sqlite3_bind_int(statement, 1, obj_id); 
     sqlite3_bind_text(statement, 2, [question_type UTF8String], -1, NULL); 
     sqlite3_bind_int(statement, 3, score); 
    } 
    if (sqlite3_step(statement) != SQLITE_DONE){ 
     NSAssert1(0, @"Error inserting: %s", errorMsg); 
    } 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
    NSLog(@"Answer saved"); 
} 
+(void)db_update_EF:(NSString *)kanji EF:(int)EF{ 
    sqlite3 *database = [self get_db]; 
     sqlite3_stmt *statement; 
    //NSLog(queryText); 
    char *errorMsg; 
    char *update = "UPDATE Kanji SET EF = ? WHERE Kanji = '?'"; 
    if (sqlite3_prepare_v2(database, update, -1, &statement, nil) == SQLITE_OK) { 
     sqlite3_bind_int(statement, 1, EF); 
     sqlite3_bind_text(statement, 2, [kanji UTF8String], -1, NULL); 
    } else { 
     NSLog(@"HMM, COULDNT RUN QUERY: %s\n", sqlite3_errmsg(database)); 
    } 
    if (sqlite3_step(statement) != SQLITE_DONE){ 
     NSAssert1(0, @"Error updating: %s", errorMsg); 
    } 
    sqlite3_finalize(statement); 
    sqlite3_close(database); 
    NSLog(@"Update saved"); 
} 

+(sqlite3 *)get_db{ 
    sqlite3 *database; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSString *copyFrom = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"/kanji_training.sqlite"]; 
    if([fileManager fileExistsAtPath:[self dataFilePath]]) { 
     //NSLog(@"DB FILE ALREADY EXISTS"); 
    } else { 
     [fileManager copyItemAtPath:copyFrom toPath:[self dataFilePath] error:nil]; 
     NSLog(@"COPIED DB TO DOCUMENTS BECAUSE IT DIDNT EXIST: NEW INSTALL"); 
    } 
    if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) { 
     sqlite3_close(database); NSAssert(0, @"Failed to open database"); 
     NSLog(@"FAILED TO OPEN DB"); 
    } else { 
     if([fileManager fileExistsAtPath:[self dataFilePath]]) { 
      //NSLog(@"DB PATH:"); 
      //NSLog([self dataFilePath]); 
     } 
    } 
    return database; 
} 

+ (NSString *)dataFilePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    return [documentsDirectory stringByAppendingPathComponent:@"kanji_training.sqlite"]; 
} 

나는 정말로 그것을 해결할 수 없다! 누구든지 나를 도울 수 있습니까?

감사합니다. SQLITE_OK입니다 준비 (가),에 관계없이 준비의 확인 여부, 그러나 당신의 변수
을 결합하면 db_insert_answer에서

답변

0
char *update = "UPDATE Kanji SET EF = ? WHERE Kanji = '?'"; 
db_update_EF에서 같은 일을

그것은 이미 문자열의

char *update = "UPDATE Kanji SET EF = ? WHERE Kanji = ?"; 

로 교체합니다. 그 물음표 주위에 작은 따옴표가 필요하지 않습니다.

1

, 당신은
명세서를 준비, 당신은 (무효 될 수있다) 문

을 실행 당신은 또한

시작이

관련 문제