[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

関連記事

NSDateを5分刻み・15分刻みで丸める

NsDateを初期値としてUIDatePicker等に設定する場合、日付の丸め処理が必要になるのでメ

記事を読む

[Swift] UITableViewのセルにアクションを設定する

セル選択→アクション UITableViewControllerを使用したテーブルビューの画面があ

記事を読む

[Swift] 関数型プログラミング

関数型プログラミングについて、ストーリー仕立ての面白い記事がありましたので紹介します。 IQ1

記事を読む

[Swift] プロパティリスト(plist)を使ってCoreDataで一括登録する

プロパティリストを使う 初期データやあらかじめ用意したデータを一括登録したい場合、プロパティリスト

記事を読む

no image

OSSの使い方がわからない・・・。

チュートリアル系の、storyboradでview controllerを置いて画面遷移を設定してっ

記事を読む

[Swift] ビルド時のエラー&iOS8でNSBigDecimalのバグ

ビルド時のエラー Swiftプロジェクトを実行中に以下のエラーが出ました。 "__TFSs15_

記事を読む

no image

小さなことからコツコツと

これまでHTMLとCSSだけで生きてきただけあって、プログラム言語がいまいちわからない。 Mo

記事を読む

App開発をはじめてみました。

はじめてみたはいいものの、右も左もわからず、書籍を読みあさり、ネットを徘徊し、いろんなことを調べ上げ

記事を読む

[Swift] Asset Catalogについて

XCode5から追加されたAsset Catalog。 いままで標準のImages.xcasset

記事を読む

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にしてみてください。 プロパテ

記事を読む

ad

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ad

[PHP] curl転送してみる(googleに)

curlでgoogle画像検索APIにアクセスしてみます。 cu

[PHP] PDOでMySQLの接続確認をする

PDO PHPでMySQLに接続する際には、mysql_connec

[PHP] ランダムな英数字を生成する

便利系メソッド 今回はPHPでランダムな英数字を作成してみます。

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にし

[Swift] Asset Catalogについて

XCode5から追加されたAsset Catalog。 いままで標準

→もっと見る

  • 1978年の七夕生まれ。 25才でweb業界の門を叩き、28才でフリーランスに。 現在は、フリーランスでマークアップ中心に、wordpressのカスタマイズやデザインをしております。 また、iPhoneアプリの開発もしております。
PAGE TOP ↑