[Swift] CoreDataで検索したデータを削除する
公開日:
:
iPhone App 開発, Swift
Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
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
関連記事
-
[Swift] ビルド時のエラー&iOS8でNSBigDecimalのバグ
ビルド時のエラー Swiftプロジェクトを実行中に以下のエラーが出ました。 "__TFSs15_
-
[Objective-C] UINavigationControllerのセグエを使って画面遷移をする
画面遷移の実装 今回はUINavigationControllerを使って画面遷移をしたいと思いま
-
小さなことからコツコツと
これまでHTMLとCSSだけで生きてきただけあって、プログラム言語がいまいちわからない。 Mo
-
[Swift] frameworkについて
先日、Swiftで実装されたライブラリをまとめたサイトを発見しました。 Swift Toolb
-
[Objective-C] バージョン更新時に変更内容をアラートで出力する
アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA
-
[Swift] 画像を合成する
画像を合成 以下の2つの画像を合成してみます。円と四角です。 画像をプロジェクトに追
-
[iPhone App] WorkManager 1.2.0版がリリースされました。
新機能 以前から要望などが多かったものを元に、機能を追加いたしました。 新バージョンで追加された
-
TabBarControllerとNavigationControllerのボタン追加
TabBarとNavigationを同時に使っているViewControllerの場合、naviga
-
[Swift] プロパティリスト(plist)の値を取得
plistからデータを取得してみます。 こちらのエントリーも参考にしてみてください。 プロパテ