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

前回「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】

 

 

Reference...

2018/04/14追記
Swift4での動作チェック済みです。コードの修正は特にしてません〜。
Swift ,

Comments...

コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。

Related Memo...

UITableView.RowAnimation の .none はアニメーションするよ

UITableView.RowAnimation の .none はアニメーションがnoneなわけじゃなく、デフォルトの設定を使うよという意味らしい。

The inserted or deleted rows use the default animations.

なのでアニメーションしちゃう。今更の気づき。

 

iOS

UINavigationController + UIScrollView の組み合わせで使っている時に謎の余白ができる時

UINavigationController + UIScrollView の組み合わせで使っていて、UIScrollView 上に AutoLayout で上下左右0で View を設置しているのに、30px程度上にずれてしまうとき。

`navigationController.navigationBar.isTranslucent = false` にすると直るかもしれない。

ScrollView上のコンテンツとNavigationBarの重なっているところが透過していたら多分これで直せるはず。

通常のターゲットではちゃんと動いているのに、iOSSnapshotTestCase を用いたテストでだけこの対応が必要なのよくわからないけれど。。。

iOS

記事を書くほどでもないけれどメモっておきたいこと

テスト投稿。

例えばiphone7 の画面サイズ

750 × 1334
半分375 × 667

iOS
more