2

我有一个带有 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) 显示无效。

4

1 回答 1

2

尽管此代码片段似乎没有显示字符串值分配给 UI 元素的位置,但似乎问题可能源于您+[NSString stringWithUTF8String:]在 while 循环内的使用。这将返回一个自动释放的字符串,如果你想在方法范围之外使用它,你会保留它。由于这些似乎是您在代码的另一部分中用于更改 UI 的实例变量,因此您有几个选择:

  1. -retain在退出方法之前向他们每个人发送一个。
  2. 使用+alloc-initWithUTF8String:
  3. 使用为您处理细节的 setter 方法或属性。(谢谢,查克!)

作为奖励,我还有一些其他相关的建议。

  • 您通过在方法的开头flashCardTextflashCardAnswer开头分配字符串来泄漏内存,因为您在 while 循环中覆盖了它们。
  • 用于在不调用的情况下-[NSString getCString:maxLength:encoding:]将查询字符串写入char*缓冲区,或者直接使用from 。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]];
于 2009-07-24T16:53:34.400 回答