2012-08-31 64 views
1

我目前有一个带有后端sqlite数据库的工作TableView应用程序来提供数据。第一个视图返回静态标题为“States”的所有状态。我想改变这种方式,以字母顺序返回州(例如阿拉巴马州,阿拉斯加州,亚利桑那州,阿肯色州属于'A'部分 - 加利福尼亚州,科罗拉多州,康涅狄格州属于'C'等部分) 。Objective-C numberOfSectionsInTableView - 按字母顺序返回段的查询

我的appdelegate调用一个查询'select id,state from state'。我有我认为是工作代码来创建下面的部分(我已经通过创建一个NSMutableArray,只有状态作为对象,它工作正常)测试了这一点。

stateIndex = [[NSMutableArray alloc] init]; 

for (int i=0; i<[listOfStates count]-1; i++){ 
    //---get the first char of each state--- 
    char alphabet = [[listOfStates objectAtIndex:i] characterAtIndex:0]; 
    NSString *uniChar = [NSString stringWithFormat:@"%C", alphabet]; 

    //---add each letter to the index array--- 
    if (![stateIndex containsObject:uniChar]) 
    {    
     [stateIndex addObject:uniChar]; 
    }   
} 

没有警告/错误,我运行模拟器,但它崩溃。过了一会儿,我明白了它为什么会崩溃。我正在尝试在搜索过程中查找字母字符,但由于原始查询调用了id和状态名称,因此它正在查看id并失败。该搜索需要在搜索中,因为它链接到另一个根据所选状态加载城市的表格。该id是主键。

所以,我的问题是...有没有一种方法可以剥离或在搜索过程中跳过id字段来创建字母部分?

预先感谢您!

修订SchoolHouse.h ========

#import <UIKit/UIKit.h> 
#import <sqlite3.h> 

@interface SchoolHouse : NSObject { 

} 

@property (assign, nonatomic, readonly) NSInteger schoolHouseID; 
@property (copy, nonatomic) NSString *schoolHouseName; 


-(id) initWithSchoolHouseData:(NSInteger)pk schoolHouseName:(NSString *)name; 

@end 
+1

如果某个东西崩溃了,那么从发布的调试器发布什么样的崩溃日志或消息会很有帮助。你还应该试着帮助我们理解listOfStates里面的对象是什么 - 只是'NSString's? –

+0

嗨,关于崩溃日志......它表示“索引中的无效字符”......我梳理列表时看到的是id(数字)而不是字符。至于listOfStates里面的对象是什么......这是NSMutableArray包含sqlquery的结果“select id,state from states”。 – user1542684

+0

我可以从代码中看到'listOfStates'是一个NSMutableArray - 我在问里面的对象是什么类?在调试器中说'po [listOfStates objectAtIndex:0]'时,他们的描述是什么? –

回答

0

请看下面的新代码。

我猜它崩溃的原因是因为你的可变数组中的一些字符串长度为零(@""),并且你不能从空字符串中得到第一个字母。我已经添加了一张支票来停止迎合这一点。您的for循环条件也将跳过最后一个元素,所以我修复了这个问题。另外,我也迫使第一个字母要大写所以@"New York"@"nevada"@"N"去下(只是为了让代码更健壮让我知道如果这还不为你工作:

编辑工作一个数组SchoolHouse对象

在你的文件的顶部,请确保您有:

#include "SchoolHouse.h" 

然后替换你的代码:

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

for (int i=0; i < [listOfStates count]; i++) { 
    SchoolHouse *schoolHouse = [listOfStates objectAtIndex:i]; 

    //---skip the object if it's the wrong class--- 
    if (![schoolHouse isKindOfClass:[SchoolHouse class]]) continue; 

    //---skip the object if it's name is empty--- 
    if (schoolHouse.schoolHouseName.length == 0) continue; 

    //---get the first char of the name--- 
    unichar firstChar = [schoolHouse.schoolHouseName characterAtIndex:0]; 
    NSString *charString = [[NSString stringWithCharacters:&firstChar length:1] uppercaseString]; 

    //---add each letter to the index array--- 
    if (![stateIndex containsObject:charString]) { 
     [stateIndex addObject:charString]; 
    } 
} 
+0

Ander,非常感谢您的回复!这当然很有意义。我非常感激。我必须等到今天下午试一试,但它看起来很有希望。我会回应。再次感谢!!! – user1542684

+0

我刚到这里,试了一下。这次我得到了一个不同的错误代码,现在读取....终止应用程序,由于未捕获异常'NSInvalidArgumentException',原因:' - [__ NSArrayM长度]:无法识别的选择器发送到实例0x8050180' – user1542684

+0

上面的代码假设'listOfStates'是一个'NSString'对象的数组。我已经更新它为一个字符串数组数组。如果这仍然不起作用,请执行一个'NSLog(@“%@”,listOfStates);'并显示输出。 – Ander