[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] Asset Catalogについて
XCode5から追加されたAsset Catalog。 いままで標準のImages.xcasset
-
[Objective-C] デリゲート (Delegate)を理解する!
デリゲートとは? デリゲートに関しての意味合いとして、”委譲”とか”代理”と説明されることが多いで
-
[Swift] ビルド時のエラー&iOS8でNSBigDecimalのバグ
ビルド時のエラー Swiftプロジェクトを実行中に以下のエラーが出ました。 "__TFSs15_
-
[Objective-C] 共通関数をまとめたクラスを作ろう!
共通クラスとは? アプリを作っていると「この処理何回も書いてるなー」ということが多々あると思います
-
[iPhone App]WorkManager アップデートしました。
Processing For App Storeでやきもきした僕です。こんにちわ。 今
-
[Swift] frameworkについて
先日、Swiftで実装されたライブラリをまとめたサイトを発見しました。 Swift Toolb
-
NSDateを5分刻み・15分刻みで丸める
NsDateを初期値としてUIDatePicker等に設定する場合、日付の丸め処理が必要になるのでメ
-
[Objective-C] バージョン更新時に変更内容をアラートで出力する
アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA
-
[iPhone App] WorkManagerの不具合について
バージョン1.2.2の不具合 11/25日現在、iPhoneアプリの「WorkManger」バージ
-
[Swift] 定数クラスをつくってみる
Objective-cの場合 今回は共通にする定数をまとめるクラスを作ってみます。 まずはO