前回「part1」では、CoreDataを導入してデータの読み込み・保存のやり方を紹介しました。
今回は、検索と更新と削除のやり方を書いていこうと思います。
前回同様に、人のデータを扱っていきます。
Entity名:Person
name / country /gender のデータをそれぞれ保存しています。
今回からこのようにして人物登録をしています。コードは割愛(´・ω・`)
それではいくつか保存した状態で説明していきます。
検索する
前回はすべてのデータを一括で取り出していましたが、今回は
まずは名前が"餅もちこ"の人を探してみます。
//検索する
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に関しては
となります。
%Kというのが出てきていますが、これは動的プロパティとして扱われるそうです。
今回は"name"が%Kにあたります。
詳しくはこちらを参考にすると良いと思います。
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での動作チェック済みです。コードの修正は特にしてません〜。
コメントはありません。
現在コメントフォームは工事中です。