2014年5月17日土曜日

Magical Record DAO

前回に続いて, Magical Recordに関する話題です.
前回は, セットアップの方法と, 利用するための初期化のコードまで書きました
今回は実際の操作(DAO)をつくります
こちらが前回の分
Magical Record 最初のステップ

データ構造

今回使用するデータはこんな感じです
Country
  • code Integer32
  • key String
Countryという名前のNSManagedObjectで, Integerと, Stringの2つのデータを持つ場合です
uniqueなキーの用なものが必要であれば, もう少し工夫が必要です
さて次はこれらのCRUD処理を書いていきます

Create 作成

-(Country *)createCountry:(int)code key:(NSString *)key {
    Country *country = [Country MR_createEntity];
    country.code = [NSNumber numberWithInt:code];
    country.key = key;
    return country;
}
利用方法
CountryDAO *cdao = [[CountryDAO alloc] init];
[cdao createCountry:1 key:@"goodtimebiz.us"];
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
最後にcommitにあたるコードをいれます

Read データをとってくる

Find All と, 属性での検索の例をのせます
-(NSArray *)findAll {
    return [Country MR_findAll];
}

-(Country *)findByCode:(int)code {
    return [Country MR_findFirstByAttribute:@"code" withValue:[NSNumber numberWithInt:code]];
}
codeで検索します

Delete

データが多い場合は, 一気に消すために truncateを使いましょう
1件ずつ消す場合は, MR_deleteAllMatchingPredicateを使います
-(void)deleteAll {
    [Country MR_truncateAll];
}

Update

Updateは特に解説するまでもないです
findなどでデータをとってきて, データを直接更新最後に
[[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];
を忘れずに

NSPredicate

少し, 条件を複雑にしたい場合, SQLのWHERE部分に相当する部分は, CoreData同様, Magical RecordでもNSPredicateを利用します
少し例をかえます. Itemという新たなデータを作りました Item
  • from Date
  • name String
  • to Date
  • uid String
少し複雑になりました
Deleteの例
-(void)deleteByUid:(NSString *)uid {
     
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"uid == %@", uid];
    [Item MR_deleteAllMatchingPredicate:predicate];
}

NSPredicateを使って, uidという値で検索して, deleteします.検索にかかったものをdeleteします
さらに複雑な例ですfromという時間を利用します
-(NSArray *)findBetweenFromTo:(NSDate *)from to:(NSDate *)to {
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(from >= %@) AND (to <= %@)", from, to];
    return [Item MR_findAllSortedBy:@"from" ascending:YES withPredicate:predicate];
}

ユニークなキー

CoreDataは自動的にprimary key的なものが追加されますが, 開発者側ではアクセスできません
自分自身で primary key 的なものを管理したい場合新たに, ユニークなキーを要素として追加する必要があります
個人的にはこんな感じに作っています
Item *item = [Item MR_createEntity];
NSString *uid = [[[item objectID] URIRepresentation] lastPathComponent];

0 件のコメント:

コメントを投稿