为什么我的UILabel会从SQLite中获取无效的NSString?

时间:2009-07-24 16:00:29

标签: objective-c sqlite uitableview nsstring uilabel

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

1 个答案:

答案 0 :(得分:2)

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

  1. 在退出方法之前向每个人发送-retain
  2. 使用+alloc-initWithUTF8String:
  3. 使用setter方法或属性来处理您的详细信息。 (谢谢,查克!)
  4. 作为奖励,我还有一些其他相关的建议。

    • 通过在方法开头为flashCardTextflashCardAnswer分配字符串来泄漏内存,因为你在while循环中覆盖它们。
    • 使用-[NSString getCString:maxLength:encoding:]在没有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]];