2009-07-24 5 views
2

私はUILabelとUITableViewのビューを持っています。私は、データベースから文字列を取得するには、このコードを使用しています:UILabelのSQLiteから無効なNSStringを取得するのはなぜですか?

-(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)が無効を示しています。

答えて

2

このコードスニペットでは、文字列の値がUI要素に割り当てられている場所は表示されていませんが、whileループ内で+[NSString stringWithUTF8String:]を使用することによって問題が発生する可能性があります。これは、メソッドの範囲外でそれを使いたい場合には、あなたが保持するオートレリースされた文字列を返します。これらは、あなたがUIを変更するには、コードの別の部分で使用インスタンス変数のように見えるので、あなたは、いくつかのオプションがあります。

  1. の方法を終了する前に、それらのそれぞれに-retainを送信します。
  2. +allocおよび-initWithUTF8String:を使用してください。
  3. 詳細を処理するセッターメソッドまたはプロパティを使用します。 (ありがとう、チャック!)

私はいくつかの他の関連する提案があります。

  • あなたは、whileループでそれらを上書きするので、メソッドの開始時にflashCardTextflashCardAnswerの文字列を割り当てることによって、メモリリークしています。
  • 使用-[NSString getCString:maxLength:encoding:]strcpy()コールなしchar*バッファにクエリ文字列を書き込み、または単に直接-cStringUsingEncoding:からchar*を使用します。
  • クエリ文字列の作成を簡略化する可能性があります。確かに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]];
+2

IMO、明示的に保持または明示のallocを使用するよりも明白な答えは、文字列の作成コードを保持しますが、インスタンス変数を設定するセッターを使用することです。 – Chuck

+0

合意した、明白なアプローチが私を逃れたとは信じられない。 :-) –

+0

'cStringUsingEncoding'の前に構文エラーが表示されています。すでにインスタンス変数を設定するためにセッターを使用しています。 –

関連する問題