2012-08-31 92 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