[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
関連記事
-
[Objective-C] デリゲート (Delegate)を理解する!
デリゲートとは? デリゲートに関しての意味合いとして、”委譲”とか”代理”と説明されることが多いで
-
[Objective-C] 文字列操作の便利Tips
Tipsいろいろ 先日の投稿 共通関数をまとめたクラスを作ろう!の流れで、文字列を操作するときに便
-
iPhoneApp WorkManager公開されました!
きっとリジェクトされるんだろうなと思いながら申請を出して1週間。 本日、公開のメールが届きまし
-
[Swift] frameworkについて
先日、Swiftで実装されたライブラリをまとめたサイトを発見しました。 Swift Toolb
-
[Swift] プロパティリスト(plist)を使ってCoreDataで一括登録する
プロパティリストを使う 初期データやあらかじめ用意したデータを一括登録したい場合、プロパティリスト
-
[Swift] CoreDataを使ってみる
SwiftでCoreData 今回はSwiftでCoreDataを使ってみます。 Xcodeプロ
-
[Swift] optional値の設定(??)
optional値がnilの時 プロジェクトでのテンプレートを選択した時にソースコードが自動生成さ