[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

関連記事

[Objective-C] no architectures to compile for … のコンパイルエラーについて

起動したプロジェクトでコンパイルエラーが出ました。 no architectures to com

記事を読む

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

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

記事を読む

[Swift] optional値の設定(??)

optional値がnilの時 プロジェクトでのテンプレートを選択した時にソースコードが自動生成さ

記事を読む

[iPhone App] WorkManagerの不具合について

バージョン1.2.2の不具合 11/25日現在、iPhoneアプリの「WorkManger」バージ

記事を読む

no image

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

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

記事を読む

[Swift] frameworkについて

先日、Swiftで実装されたライブラリをまとめたサイトを発見しました。 Swift Toolb

記事を読む

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

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

記事を読む

[iPhone App]WorkManager アップデートしました。

Processing For App Storeでやきもきした僕です。こんにちわ。 今

記事を読む

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

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

記事を読む

[Objective-C] バージョン更新時に変更内容をアラートで出力する

アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA

記事を読む

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 ↑