2 Stimmen

Warum erhalte ich einen ungültigen NSString von SQLite für mein UILabel?

Ich habe eine Ansicht mit einem UILabel und einem UITableView. Ich verwende diesen Code, um eine Zeichenfolge aus einer Datenbank abzurufen:

-(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];    
}

Wenn ich auf die Tabellenzelle klicke, wird der String-Wert (flashCardAnswer) als ungültig angezeigt.

2voto

Quinn Taylor Punkte 44113

Obwohl dieser Codeschnipsel nicht zu zeigen scheint, wo der String-Wert dem UI-Element zugewiesen wird, scheint es, dass das Problem von Ihrer Verwendung von +[NSString stringWithUTF8String:] innerhalb der while-Schleife. Dies gibt eine automatisch freigegebene Zeichenkette zurück, die Sie beibehalten können, wenn Sie sie außerhalb des Anwendungsbereichs der Methode verwenden möchten. Da es sich hierbei um Instanzvariablen zu handeln scheint, die Sie in einem anderen Teil des Codes verwenden, um die Benutzeroberfläche zu ändern, haben Sie einige Möglichkeiten:

  1. Senden Sie eine -retain bevor die Methode beendet wird.
  2. Verwenden Sie +alloc y -initWithUTF8String: .
  3. Verwenden Sie eine Setter-Methode oder eine Eigenschaft, die die Details für Sie übernimmt. (Danke, Chuck!)

Als Bonus habe ich noch ein paar andere Vorschläge, die damit zusammenhängen.

  • Sie verlieren Speicher, indem Sie Strings für flashCardText y flashCardAnswer am Anfang der Methode, da Sie sie in der while-Schleife überschreiben.
  • Verwenden Sie -[NSString getCString:maxLength:encoding:] um die Abfragezeichenfolge in eine char* Puffer ohne den strcpy() aufzurufen, oder verwenden Sie einfach die char* de -cStringUsingEncoding: direkt.
  • Es gibt viele Möglichkeiten zur Vereinfachung des Aufbaus Ihrer Abfragezeichenfolge - untersuchen Sie auf jeden Fall NSMutableString . Zum Beispiel...

    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]];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X