Domanda

Ho una visione con un UILabel e un UITableView. Sto usando questo codice per ottenere una stringa da un database:

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

Quando clicco sulla cella tabella, il valore stringa (flashCardAnswer) mostra valido.

È stato utile?

Soluzione

Anche se questo frammento di codice non sembra mostrare dove il valore della stringa viene assegnato al elemento dell'interfaccia utente, sembrerebbe che il problema potrebbe derivare dall'uso di +[NSString stringWithUTF8String:] all'interno del ciclo while. Questo restituisce una stringa autoreleased che si conserva molto se si desidera utilizzarlo al di fuori del campo di applicazione del metodo. Dal momento che coloro che sembrano essere variabili di istanza che si utilizza in un'altra parte del codice per modificare l'interfaccia utente, avete alcune opzioni:

  1. Invia un -retain a ciascuno di loro prima di uscire dal metodo.
  2. Usa +alloc e -initWithUTF8String:.
  3. Usa un metodo setter o una proprietà che si prende cura dei dettagli per voi. (Grazie, Chuck!)

Come bonus, ho alcuni altri suggerimenti correlati.

  • Si sta perdendo la memoria assegnando stringhe per flashCardText e flashCardAnswer all'inizio del metodo, dal momento che li sovrascrivere nel ciclo while.
  • Usa -[NSString getCString:maxLength:encoding:] per scrivere la stringa di query in un buffer char* senza la chiamata strcpy(), o semplicemente utilizzare il char* da -cStringUsingEncoding: direttamente
  • .
  • C'è un grande potenziale per semplificare la costruzione della vostra stringa di query - sicuramente indagare NSMutableString . Per esempio ...
    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]];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top