0

テスト目的でdatabase.sqliteと呼ばれるデータベースからtableView値をロードしたいと思います。次のものが入力されています。

1月1日

2月2日

... 至るまで ...

12月12日

ご覧のとおり、私はFMDBを使用しています。次の行はコンパイルされますが、クラッシュします。

NSString *myString = [[rows objectAtIndex:myNumber] objectForKey:@"MonthName"];

私の問題の一部であるCocoaでのIntとStringの扱い方に一貫性がないため、問題が発生しています。また、そこにはNSLogデバッグ行がありますが、このアプローチは複雑に見えます。どんなアドバイスをいただけますか?

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"database.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];

NSLog(@"Open Database");
FMResultSet *results = [database executeQuery:@"SELECT * FROM monthly"];

while([results next]) {
    NSString *name = [results stringForColumn:@"name"];
    NSInteger age  = [results intForColumn:@"age"];

    // Stuff Data into Array
    NSMutableArray *rows = [[NSMutableArray alloc] init];
    NSMutableDictionary *firstRow = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:age], @"MonthID", [NSString stringWithFormat:@"%@", name], @"MonthName", nil];
    [rows addObject:firstRow];
    NSLog(@"Month: %@ - %d",name, age);
    int myNumber = [[firstRow objectForKey:@"MonthID"] intValue];

    // *** THE LINE BELOW IS GIVING ME PROBLEMS ***
    NSString *myString = [[rows objectAtIndex:myNumber] objectForKey:@"MonthName"];

    // NSLog(@"Month No: %@ - %d",myString, myNumber);
    NSLog(@"***** Month No: %d", myNumber);
    // [self.monthMonths myString]; 
}
[database close];
NSLog(@"Close Database");
4

3 に答える 3

1

ループrowsの外側で配列を宣言します。while

次の行をwhileループの上に移動します。

NSMutableArray *rows = [[NSMutableArray alloc] init];
于 2012-07-10T09:21:10.207 に答える
1

インデックスまたは月の ID が 1 から始まっているため、この行でエラーが発生しますが、配列に追加すると次のようになります。

[rows addObject:firstRow];

0 インデックス (デフォルトの開始インデックス) に追加されます。したがって、この行を呼び出すと:

NSString *myString = [[row s objectAtIndex:myNumber] objectForKey:@"MonthName"];

次の理由により、インデックス 1 で値を抽出しようとします。

int myNumber = [[firstRow objectForKey:@"MonthID"] intValue];

配列にはインデックス 0 の値が 1 つしか含まれていないため、実際には存在しないインデックス 1 の値を抽出しようとするため、クラッシュします。

編集:これを使用してみてください:

NSMutableArray *rows = [[NSMutableArray alloc] init];
while([results next]) {
    NSString *name = [results stringForColumn:@"name"];
    NSInteger age  = [results intForColumn:@"age"];

    NSMutableDictionary *firstRow = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:age], @"MonthID", [NSString stringWithFormat:@"%@", name], @"MonthName", nil];

// Stuff Data into Array
    [rows addObject:firstRow];
    NSLog(@"Month: %@ - %d",name, age);
    int myNumber = [[firstRow objectForKey:@"MonthID"] intValue]-1; //to get value at proper index...

    // *** THE LINE BELOW IS GIVING ME PROBLEMS ***
    NSString *myString = [[rows objectAtIndex:myNumber] objectForKey:@"MonthName"];

    // NSLog(@"Month No: %@ - %d",myString, myNumber);
    NSLog(@"***** Month No: %d", myNumber);
    // [self.monthMonths myString]; 
}
于 2012-07-10T09:30:13.627 に答える
0

int 値を文字列形式に変換できます。

int myNumber = [[firstRow objectForKey:@"MonthID"] intValue];
NSString *myString = [NSString StringWithFormat:@"%d",[[rows objectAtIndex:myNumber] objectForKey:@"MonthName"]];

NSlog(@"MonthName :%@", MonthName);
于 2012-07-10T09:18:18.733 に答える