我有一个UILabel和UITableView的视图。我正在使用此代码从数据库中获取字符串:
-(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)显示无效。
答案 0 :(得分:2)
虽然此代码段似乎没有显示字符串值分配给UI元素的位置,但似乎问题可能源于您在while循环中使用+[NSString stringWithUTF8String:]
。这将返回一个自动释放的字符串,如果要在方法范围之外使用它,则可以保留该字符串。由于这些似乎是您在代码的另一部分中使用的实例变量来更改UI,因此您有以下几种选择:
-retain
。+alloc
和-initWithUTF8String:
。作为奖励,我还有一些其他相关的建议。
flashCardText
和flashCardAnswer
分配字符串来泄漏内存,因为你在while循环中覆盖它们。-[NSString getCString:maxLength:encoding:]
在没有char*
调用的情况下将查询字符串写入strcpy()
缓冲区,或者直接使用char*
中的-cStringUsingEncoding:
。 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]];