MagicalRecordは、CoreDataを使うときにとても役に立つライブラリです。
基本的に、件数が多くなるようなデータを扱う場合はCoreDataを使って処理するようにしています。
MagicalRecordで、各NSManagedObjectを新規作成・更新・削除するのはとても簡単です。
バックグラウンドで処理できる便利なメソッドが用意されています。
ぼくの備忘録も兼ねて、この記事は以下のサイトを参考にしています。
主要な部分を引用しています。
How to save using MagicalRecord – Junda Ong
新規作成・更新・削除
NSManagedObjectを新規作成・更新・削除する場合は、以下のメソッドを呼ぶことから始めます。
[MagicalRecord saveWithBlock:
※メソッドは、何も設定しなければMR_のPrefixが必要です。
例として上記サイトより引用しますが、Entityを更新する場合のコードは以下のようなものです。
Poo というクラスは NSManagedObjectです。これはご自身の環境に合せて、それぞれのモデルに置き換えてください。
Poo *poo = [Poo findFirst];
// saveWithBlock:の中で、Entityを更新
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
Poo *localPoo = [poo inContext:localContext];
localPoo.value = "hogehoge";
}];
NSManagedObjectを削除したい場合は、先に削除したいNSManagedObjectを取得します。
そのあとは更新と同様にブロック内でNSManagedObjectContextからNSManagedObjectを取得し、deleteEntity
メソッドを呼んでください。
上記の例だと [localPoo deleteEntity]
としてください。
つまり、このブロックから得るNSManagedObjectContextを使って、Entityを操作することで、作成、更新、削除ができます。
バックグラウンドでの操作
スレッドについてですが、saveWithBlock
はバックグラウンドで動作します。
メインスレッドではありません。
もし、UIを更新するなどでメインスレッドを使う場合は、saveWithBlock:completion:
メソッドを使います。
completion
のブロック内は、メインスレッドで動作します。
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
// ここは、バックグラウンドで動作します。
} completion:^(BOOL success, NSError *error) {
// ここは、メインスレッドで動作します。
}];
それ以外に、 saveWithBlockAndWait:
メソッドを使うこともできます。
[MagicalRecord saveWithBlockAndWait:^(BOOL success, NSError *error) {
// ここは、メインスレッドで動作します。
}];
さいごに
CoreDataをバックグラウンドで取り扱うには、各動作ごとにコンテキストを用意しておく必要があり割と煩雑な管理をしなければならず、そのあたりもうまくカバーしているのでMagicalRecordは使いやすいライブラリです。
このライブラリがあればすんなり使えるCoreDataですが、Appleのドキュメントで一通り使い方を学んだあとにいくつか本を読みました。その中でも情報収集するなら「iOS Core Data徹底入門」という本がおすすめです。
Amazonの評価だと初心者向けの内容から始まるとのことですが、これはその通りです。
しかし、後半のCoreDataの使い方は結構役に立ちました。
DB関連の知識もあった方が良さそうですが、CoreDataならこの本をオススメします。