Uilabel을 위해 sqlite에서 잘못된 nsstring을받는 이유는 무엇입니까?
-
19-09-2019 - |
문제
나는 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를 변경하는 것으로 보이므로 몇 가지 옵션이 있습니다.
- 보내
-retain
방법을 종료하기 전에 그들 각각에게. - 사용
+alloc
그리고-initWithUTF8String:
. - 세부 사항을 처리하는 세터 방법이나 속성을 사용하십시오. (감사합니다, 척!)
보너스로서, 나는 몇 가지 다른 관련 제안이 있습니다.
- 당신은 줄을 할당하여 메모리를 새기고 있습니다
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]];
제휴하지 않습니다 StackOverflow