1

私は現在、データを供給するためのバックエンド sqlite データベースを備えた作業中の TableView アプリケーションを持っています。最初のビューは、「州」という静的な見出しを持つすべての州を返します。アルファベット順のセクションで州を返すように変更したいと思います (たとえば、アラバマ、アラスカ、アリゾナ、アーカンソーは「A」というセクションに分類されます。カリフォルニア、コロラド、コネチカットは「C」というセクションに分類されます)。 .

私の appdelegate は、クエリを呼び出して「状態から ID、状態を選択」します。以下のセクションを作成するための作業コードであると思われるものがあります(状態だけをオブジェクトとして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 は主キーです。

それで、私の質問は...アルファベット順のセクションを作成するために、この検索中に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
4

1 に答える 1

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];
    }
}
于 2012-08-31T06:38:31.660 に答える