2012-07-10 83 views
0

我想从数据库中加载tableView值,调用test.sqlite。 它填充了以下内容:从NSMutableDictionary中检索字符串值

1月

2月

...到...

12月

正如你会看到我使用FMDB。下面一行编译但崩溃:话说

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

我有问题,你在可可处理类型为int和字符串不一致的方式这是我的问题的一部分。另外,虽然在那里有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"); 
+0

您的项目崩溃的唯一原因是因为对于每个循环迭代创建行阵列,当你插入的对象时,它也适用于指数0。因此,每次数组中只有1个对象。正如@Aadhira所说,向上移动线路,希望你会没事的。 – 2012-07-10 09:29:12

回答

1

此行给出错误,因为你的食指或一个月ID是从1开始的,但是当你在阵列添加:

[rows addObject:firstRow]; 

它在0指数(默认起始指数)被添加。 所以,当你调用这个行:

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

它试图索引1处提取的价值,因为:

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

它实际上尝试提取索引1值中不存在,因为您的阵列只包含索引0处的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]; 
} 
+0

感觉尴尬关于在一个循环内声明数组,并且是的,我确实需要通过-1来抵消该数组,否则它会崩溃。两个宝贵的经验教训。感谢您的时间和耐心。 – 2012-07-10 12:35:12

+0

欢迎您! – 2012-07-10 12:37:57

0

则可以将int值转换为字符串格式,

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

NSlog(@"MonthName :%@", MonthName); 
1

声明数组rowswhile循环之外。

将以下行移动到while循环上方。

NSMutableArray *rows = [[NSMutableArray alloc] init];