うるおいらんど

【Swift 3】CoreDataを使ってみた。検索・更新・削除編【part2】

CoreDataSwift

追記があります。

前回「part1」では、CoreDataを導入してデータの読み込み・保存のやり方を紹介しました。

今回は、検索と更新と削除のやり方を書いていこうと思います。

 

前回同様に、人のデータを扱っていきます。

Entity名:Person

name / country /gender のデータをそれぞれ保存しています。

 

今回からこのようにして人物登録をしています。コードは割愛(´・ω・`)

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-10-10-2-45-29

 

それではいくつか保存した状態で説明していきます。

 

検索する

前回はすべてのデータを一括で取り出していましたが、今回はとある決まった条件の人のみを検索して読み込みます。

まずは名前が"餅もちこ"の人を探してみます。

 

//検索する
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
let context:NSManagedObjectContext = appDelegate.managedObjectContext
let fetchRequest:NSFetchRequest<Person> = Person.fetchRequest()
let predicate = NSPredicate(format:"%K = %@","name","餅もちこ")
fetchRequest.predicate = predicate
let fetchData = try! context.fetch(fetchRequest)
if(!fetchData.isEmpty){
      for i in 0..<fetchData.count{
           print("\(fetchData[i].name!)の国は\(fetchData[i].country!)です")
      }
}

 

以前と違うのは、マーカーを引いた5〜6行目です。

predicateの意味は述語/述部といった意味らしいです。難しい。

ここに検索するものの型を書いていきます。

数字に関してはC言語とほぼ同じと思って多分大丈夫です。

Int → %d

Float → %f

となります。

Stringに関しては

String → %@

となります。

 

%Kというのが出てきていますが、これは動的プロパティとして扱われるそうです。

今回は"name"が%Kにあたります。

詳しくはこちらを参考にすると良いと思います。

NSPredicate 全構文解説

objective-cですがSwiftでもほとんど同じのはず・・・

 

更新する

次にデータを更新していきます。

"餅もちこ"のデータを取り出して、国を"アメリカ"に変更します。

//更新する
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
let context:NSManagedObjectContext = appDelegate.managedObjectContext
let fetchRequest:NSFetchRequest<Person> = Person.fetchRequest()
let predicate = NSPredicate(format:"%K = %@","name","餅もちこ")
fetchRequest.predicate = predicate
let fetchData = try! context.fetch(fetchRequest)
if(!fetchData.isEmpty){
      for i in 0..<fetchData.count{
           fetchData[i].country = "アメリカ"
           print("\(fetchData[i].name!)の国は\(fetchData[i].country!)です")
      }
      do{
           try context.save()
      }catch{
           print(error)
      }
}

 

先ほどの検索に、更新する行を付け足しただけです。保存もしておきます。

 

削除する

削除の場合も同様に、検索して削除していきます。

//削除する
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
let context:NSManagedObjectContext = appDelegate.managedObjectContext
let fetchRequest:NSFetchRequest<Person> = Person.fetchRequest()
let predicate = NSPredicate(format:"%K = %@","name","餅もちこ")
fetchRequest.predicate = predicate
let fetchData = try! context.fetch(fetchRequest)
if(!fetchData.isEmpty){
      for i in 0..<fetchData.count{
            let deleteObject = fetchData[i] as Person
            context.delete(deleteObject)
      }
      do{
            try context.save()
      }catch{
            print(error)
      }
}

 

名前が"餠もちこ"の人がいた場合、deleteで削除しています。

 

こんな感じで、一度検索して→更新・削除といった形になります。

 

今回は短いですがここまでで。

後々検索・更新・削除について書き足すかもしれません。

 

part3ではRelationshipについて書くつもりです。

以前よりSwift3に対応した記事を目にするようになったのですが、なんか私のコードとちょいちょい違うところあってちょっと不安・・・

 

※一部修正しました!

保存時にappDelegate.saveContext()としていたのですが、アプリ終了時に全てデータが消えてしまっていることがわかりました。

context.save()に変更することで保存に成功しました。大変失礼しました。

 

それではでは

 

※part3書きました。(2016/10/17)

【Swift 3】CoreDataをつかってみた。Relationshipをつけよう【part 3】

 

 

参考リンク

Additional Notes追記

Swift4での動作チェック済みです。コードの修正は特にしてません〜。

Comments

コメントはありません。

現在コメントフォームは工事中です。