【Swift】CoreDataの使い方(追加、読込、更新、削除)簡単に。。【入門】
こんにちは、iPhoneアプリ開発者の中川です。
“CoreData"使ってますか?
ネットで"CoreData"を調べてみると、原理原則が記述されていて前置きで疲れてしまうということはないでしょうか。"CoreData"はとっかかりこそ難しいものの、慣れてしまえば非常に便利なツールです。慣れるためには、コードを書きながら覚えるのが手っ取り早いのではないでしょうか。
本記事は、"CoreData"におけるデータの追加、読込、更新、削除について説明します。更に、リレーションについても記述します。
まずは今回サンプルとして扱うデータはこちら。
商品と店にテーブルを分けています。
例えば、水が売ってあるのは市場で、牛が売ってあるのは牧場。
といった具合です。
ER図を描きます。(エンティティ・リレーション・図)
これをXcodeのModelファイル projectname.xcdatamodeldに製図すると。
製図が終わると、Xcode → Editor → Create NSManagedObject Subclass…でエンティティのクラスを作成します。すると、Item+CoreDataProperties.swift、Item.swift、Shop+CoreDataProperties.swift、Shop.swiftという4つのファイルができます。
それでは、追加、読込、更新、削除いってみましょう。
と言っても、ItemテーブルはShopテーブルが完成しないと作れない(リレーションできない)ので、Shopテーブルを作っていきましょう。
まずは約束事であるCoreDataのimport
1 |
import CoreData |
【追加】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// CoreDataに指令を出すmanagedObjectContextを生成 let appdel = UIApplication.sharedApplication().delegate as! AppDelegate let managedObjectContext = appdel.managedObjectContext // Shopエンティティを指定 let entity = NSEntityDescription.entityForName("Shop", inManagedObjectContext: managedObjectContext) let shop = Shop(entity: entity!, insertIntoManagedObjectContext: managedObjectContext) // データ追加 shop.id = 1 shop.name = "市場" // 保存 do{ try managedObjectContext.save() }catch{ } |
【読込】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// CoreDataに指令を出すmanagedObjectContextを生成 let appdel = UIApplication.sharedApplication().delegate as! AppDelegate let managedObjectContext = appdel.managedObjectContext // 読み込むエンティティを指定 let fetchReq = NSFetchRequest(entityName: "Shop") // データを格納する空の配列を用意 var results = [] // 読み込み実行 do { results = try managedObjectContext.executeFetchRequest(fetchReq) }catch{ } // Shopインスタンスを生成 let shop = results[0] as! Shop // データにアクセス print(shop.name!) |
【更新】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// CoreDataに指令を出すmanagedObjectContextを生成 let appdel = UIApplication.sharedApplication().delegate as! AppDelegate let managedObjectContext = appdel.managedObjectContext // 読み込むエンティティを指定 let fetchReq = NSFetchRequest(entityName: "Shop") // 更新するデータを指定する。この場合ショップ名が市場のレコード。 let predict = NSPredicate(format: "%K=%@", "name", "市場") fetchReq.predicate = predict // データを格納する空の配列を用意 var results = [] // 読み込み実行 do { results = try managedObjectContext.executeFetchRequest(fetchReq) }catch{ } let shop = results[0] as! Shop shop.id = 2 shop.name = "牧場" // 保存 do{ try managedObjectContext.save() }catch{ } |
【削除】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// CoreDataに指令を出すmanagedObjectContextを生成 let appdel = UIApplication.sharedApplication().delegate as! AppDelegate let managedObjectContext = appdel.managedObjectContext // 読み込むエンティティを指定 let fetchReq = NSFetchRequest(entityName: "Shop") // 更新するデータを指定する。この場合ショップ名が市場のレコード。 let predict = NSPredicate(format: "%K=%@", "name", "牧場") fetchReq.predicate = predict // データを格納する空の配列を用意 var results = [] // 読み込み実行 do { results = try managedObjectContext.executeFetchRequest(fetchReq) }catch{ } // Shopインスタンスを生成 let shop = results[0] as! Shop // 削除 managedObjectContext.deleteObject(shop) // 保存 do{ try managedObjectContext.save() }catch{ } |
このようにデータを追加・読込・更新・削除しながらShopテーブルが完成します。(特に修正させなければ追加だけでShopテーブルは完成します。)
【リレーション】
さて、次にItemテーブルを作っていくのですが、Shopテーブルとのリレーションが必要になってきます。
(例:商品テーブルの水のshopは、Shopテーブルのname="市場"の部分)文字にするとややこしいなぁ。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
// CoreDataに指令を出すmanagedObjectContextを生成 let appdel = UIApplication.sharedApplication().delegate as! AppDelegate let managedObjectContext = appdel.managedObjectContext // Itemエンティティを指定 let entity = NSEntityDescription.entityForName("Item", inManagedObjectContext: managedObjectContext) let item = Item(entity: entity!, insertIntoManagedObjectContext: managedObjectContext) // データ追加 item.name = "水" item.price = 10 // リレーションさせるデータをShopテーブルから読込 // 読み込むエンティティを指定 let fetchReq = NSFetchRequest(entityName: "Shop") // データを指定する。この場合ショップ名が市場のレコード。 let predict = NSPredicate(format: "%K=%@", "name", "市場") fetchReq.predicate = predict // データを格納する空の配列を用意 var results = [] // 読み込み実行 do { results = try managedObjectContext.executeFetchRequest(fetchReq) }catch{ } // Shopインスタンスを生成 let shop = results[0] as! Shop // リレーションさせるデータを追加 item.shop = shop // 保存 do{ try managedObjectContext.save() }catch{ } |
これでItemテーブルにShopテーブルをリレーションさせるできました。
ここで疑問に思う人もいるかもしれません。
リレーションさせて な・に・が いいの?
それは市場が潰れて、コンビニになった場合です。
その場合、Shopテーブルを読み込んで、市場をコンビニに修正するだけでItemテーブルは変更しなくてもいいということになります。
さて、表題に「簡単に。。」と書いたくせに長くなってしまいました。(極力短くしたつもりなのですが。)
これから初めてCoreDataをいじるという人は何度かこの記事を読みながらコーディングしてみてください。
慣れれば簡単なCoreDataなので、慣れるまで頑張ってくださいね!
(SQLiteをわざわざCoreDataを使ってやってるだけじゃないですかとか言わないでね。)
ディスカッション
コメント一覧
まだ、コメントがありません