문제

나는 uilabel과 uitable view로 볼 수 있습니다. 이 코드를 사용하여 데이터베이스에서 문자열을 얻습니다.

-(void)getOneQuestion:(int)flashcardId categoryID:(int)categoryId {
    flashCardText=[[NSString alloc] init];
    flashCardAnswer=[[NSString alloc] init];

    NSString *martialStr=[NSString stringWithFormat:@"%d", flashcardId];    
    NSString *queryStr=[[NSString alloc] initWithString:@"select flashCardText,flashCardAnswer,flashCardTotalOption from flashcardquestionInfo where flashCardId="];
    queryStr=[queryStr stringByAppendingString:martialStr]; 

    NSString *martialStr1=[NSString stringWithFormat:@"%d", categoryId];    
    NSString *queryStr2=[[NSString alloc] initWithString:@" and categoryId="];
    queryStr2=[queryStr2 stringByAppendingString:martialStr1];  
    queryStr=[queryStr stringByAppendingString:queryStr2];  

    unsigned int lengthOfString=[queryStr length];
    char temp2[lengthOfString +1];
    strcpy(temp2, [queryStr cStringUsingEncoding:NSUTF8StringEncoding]);    
    clsDatabase *clsDatabaseObject = [[clsDatabase alloc] init];    
    sqlite3_stmt *dataRows = [clsDatabaseObject getDataset:temp2];
    while(sqlite3_step(dataRows) == SQLITE_ROW) {       
        flashCardText =[NSString stringWithUTF8String:(char *)sqlite3_column_text(dataRows,0)];
        flashCardAnswer=[NSString stringWithUTF8String:(char *)sqlite3_column_text(dataRows,1)];
        flashCardTotalOption=sqlite3_column_int(dataRows,2);
    }
    sqlite3_reset(dataRows);
    sqlite3_finalize(dataRows);
    [clsDatabaseObject release];    
}

테이블 셀을 클릭하면 문자열 값 (FlashCardanswer)이 유효하지 않은 것으로 나타났습니다.

도움이 되었습니까?

해결책

이 코드 스 니펫은 문자열 값이 UI 요소에 위치하는 위치를 보여주지 않는 것 같습니다. +[NSString stringWithUTF8String:] while 루프 내부. 이것은 메소드의 범위 밖에서 사용하려는 경우 자율적 인 문자열을 반환합니다. 코드의 다른 부분에서 사용하는 인스턴스 변수로 UI를 변경하는 것으로 보이므로 몇 가지 옵션이 있습니다.

  1. 보내 -retain 방법을 종료하기 전에 그들 각각에게.
  2. 사용 +alloc 그리고 -initWithUTF8String:.
  3. 세부 사항을 처리하는 세터 방법이나 속성을 사용하십시오. (감사합니다, 척!)

보너스로서, 나는 몇 가지 다른 관련 제안이 있습니다.

  • 당신은 줄을 할당하여 메모리를 새기고 있습니다 flashCardText 그리고 flashCardAnswer 메소드가 시작될 때 while 루프로 덮어 쓰기 때문에.
  • 사용 -[NSString getCString:maxLength:encoding:] 쿼리 문자열을 a에 씁니다 char* 없는 버퍼 strcpy() 전화하거나 그냥 사용하십시오 char* ~에서 -cStringUsingEncoding: 곧장.
  • 쿼리 문자열의 구성을 단순화 할 수있는 많은 잠재력이 있습니다. NSMutableString. 예를 들어...
    NSMutableString* query = [[NSMutableString alloc] initWithString:@"select flashCardText,flashCardAnswer,flashCardTotalOption from flashcardquestionInfo"];
    [query appendFormat:@" where flashCardId=%d", flashcardId];
    [query appendFormat:@" and categoryId=%d", categoryId];
    clsDatabase *clsDatabaseObject = [[clsDatabase alloc] init];
    sqlite3_stmt *dataRows = [clsDatabaseObject getDataset:[query cStringUsingEncoding:NSUTF8StringEncoding]];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top