[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
-
-
[Swift] Swiftでいろんなfor文まとめてみた
いろんなfor文 プログラム作成で必ず出てくるfor文を自分なりにまとめてみました。 Swift
-
-
[Swift] プロパティリスト(plist)を使ってCoreDataで一括登録する
プロパティリストを使う 初期データやあらかじめ用意したデータを一括登録したい場合、プロパティリスト
-
-
[Objective-C] 共通関数をまとめたクラスを作ろう!
共通クラスとは? アプリを作っていると「この処理何回も書いてるなー」ということが多々あると思います
-
-
[Swift] UITableViewのセルにアクションを設定する
セル選択→アクション UITableViewControllerを使用したテーブルビューの画面があ
-
-
NSDateを5分刻み・15分刻みで丸める
NsDateを初期値としてUIDatePicker等に設定する場合、日付の丸め処理が必要になるのでメ
-
-
[Objective-C] no architectures to compile for … のコンパイルエラーについて
起動したプロジェクトでコンパイルエラーが出ました。 no architectures to com
-
-
[Swift] frameworkについて
先日、Swiftで実装されたライブラリをまとめたサイトを発見しました。 Swift Toolb