[Swift] CoreDataで検索したデータを削除する
公開日:
:
iPhone App 開発, Swift
CoreDataの検索と削除
前の投稿 [Swift] CoreDataを使ってみる をふまえて今度は検索&削除をしてみたいと思います。
CoreDataの検索はNSPredicateを使います。
Objective-Cの場合
- (NSError *)deleteData:(NSString *)entityName managedObjectContext:(NSManagedObjectContext *)managedObjectContext whereString:(NSString *)whereString { NSFetchRequest *deleteRequest = NSFetchRequest.new; [deleteRequest setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]]; if (whereString != nil) { NSPredicate *predicate = [NSPredicate predicateWithFormat:whereString]; [deleteRequest setPredicate:predicate]; } NSError *error = nil; NSArray *results = [managedObjectContext executeFetchRequest:deleteRequest error:&error]; for (NSManagedObject *data in results) { [managedObjectContext deleteObject:data]; } NSError *saveError = nil; [managedObjectContext save:&saveError]; return saveError; }
引数は
- entityName:テーブル名
- managedObjectContext:CoreDataを操作するオブジェクト
- whereString:検索条件の文字列
7〜8行目で引数で渡された検索文字列を設定します。
11行目で検索データを1つずつ削除します。
エラーがあった場合は、NSErrorとして戻り、成功した場合はnilになります。
Swiftの場合
func deleteData(entityName:String, managedObjectContext: NSManagedObjectContext, whereString: String) -> NSError? { let deleteRequest = NSFetchRequest() deleteRequest.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: managedObjectContext) let predicate : NSPredicate = NSPredicate(format: whereString, argumentArray: nil) deleteRequest.predicate = predicate var error: NSError? = nil if let results = managedObjectContext.executeFetchRequest(deleteRequest, error: &error) { for result in results { managedObjectContext.deleteObject(result as NSManagedObject) } } var saveError: NSError? = nil managedObjectContext.save(&saveError) return saveError }
処理はObjective-Cの時と同様です。
注意が必要なのは、5行目のNSPredicateで検索条件を設定する箇所です。
NSPredicateのフォーマット設定でfromMetadataQueryStringていうのがあったんですが、うまくいきませんでした。
なのでargumentArrayはnilでformatに設定しています。
また、このときwhereStringの文字列にoptional値が含まれている場合はエラーになります。
例えば使用するときに
if let object: SampleEntity = self.fetchedResultsController.objectAtIndexPath(indexPath) as? SampleEntity { self.deleteData("SampleEntity", managedObjectContext: context, whereString: "id = \(object.id!)") }
!マークでnilが来ないことを確定することが重要です。format関数では必ずOptional値を確定してください。
まとめ
Swiftを触り始めて、とにかくOptionalバインディングに振り回されています。
Objective-Cで書かれた既存プロジェクトをSwiftに書き換えようとすると、エラー連発だろうなー。
Swiftを使うメリットって何なんでしょうね。
ad
関連記事
-
-
[Objective-C] iPhoneアプリからのメーラー起動
今回はiPhoneアプリからメーラーを起動する処理を紹介します。 メーラー起動のコントローラー
-
-
NSDateを5分刻み・15分刻みで丸める
NsDateを初期値としてUIDatePicker等に設定する場合、日付の丸め処理が必要になるのでメ
-
-
[Swift] スクリーンサイズを取得する
スクリーンサイズを取得 iPhoneの幅と高さを取得する関数を紹介します。 iOS8から画面の傾
-
-
[iPhone App] WorkManager 1.2.0版がリリースされました。
新機能 以前から要望などが多かったものを元に、機能を追加いたしました。 新バージョンで追加された
-
-
小さなことからコツコツと
これまでHTMLとCSSだけで生きてきただけあって、プログラム言語がいまいちわからない。 Mo
-
-
[Objective-C] デリゲート (Delegate)を理解する!
デリゲートとは? デリゲートに関しての意味合いとして、”委譲”とか”代理”と説明されることが多いで
-
-
iPhoneApp WorkManager公開されました!
きっとリジェクトされるんだろうなと思いながら申請を出して1週間。 本日、公開のメールが届きまし
-
-
[Swift] UITabBarControllerでタブ選択時のイベントを取得する
UITabBarController タブを使った画面を作成する場合はUITabBarContro