iPhone SDK NSSet型のデータは直接ソートできないので、遠回りな方法でソートする

| コメント(0) | トラックバック(0)
CoreDataを使っていて、リレーションなどごちゃごちゃやって、関連するデータを取り出してみたら、そのデータがソートされていない。単純にDBに保持されているものを持ってくるだけだから、並び替えしていないってことで、自前で並び替えなければならない。SQLが使えれば楽なのに。。。

で、調べてみたので、残しておく。

※ 下記ソースの簡単な説明として、CoreDataから1つのteamDataを取得し、それに紐付くNSSet型のmembersのデータ(Member *)を、複数の条件で並び替えすることを想定している。

// CoreDataのリレーションで関係づけられたデータは、NSSet型で保存される.

NSSet *members = teamData.members;


// ソートする条件を指定。

NSSortDescriptor *sort1 = [NSSortDescriptor

                           sortDescriptorWithKey:@"memberNo"

                           ascending:YES] ;

NSSortDescriptor *sort2 = [NSSortDescriptor

                           sortDescriptorWithKey:@"activeFlag"

                           ascending:NO] ;


// ソートする条件を配列で保持。

NSArray *sortDescriptors = [NSArray arrayWithObjects:

                            sort1,sort2,nil];

// NSSet型のmembersをソートして配列membersArrayに保持。

NSArray *membersArray = [members sortedArrayUsingDescriptors:

                         sortDescriptors];


// 結果を見てみよう。

for (Member* memberData in membersArray) {

    NSLog(@"memberData   %@ %@",

               memberData.memberNo,

               memberData.activeFlag);

}


これで並び替えができているはず。(ただし、このソースはサンプルで、実際にコンパイルはしていないので悪しからず)

また、もしソート条件が1つだけの場合には、arrayWithObject: を使えばよい。複数の場合の arrayWithObjects: は最後の"nil"が大事。忘れてコンパイルが通らなくて焦った。

NSArray *sortDescriptors = [NSArray arrayWithObject:sort1];



PHPだったらsortOn("memberNo"); とかやればいいので便利だけど、Objective-Cはまだ慣れない。。。


トラックバック(0)

トラックバックURL: http://www.siesta-design.com/mtadmin/mt-tb.cgi/19

コメントする

2011年4月

          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30