Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 613 - CoreDataMyDemo 2

2016年3月25日:追記

Core Dataの簡単なチュートリアルに何度も挑戦しています。何度も繰り返して基本を覚えないと次に進めない頭の固い50オヤジです(T_T)

CoreDataMyDemoに取り組んでいます。

次はNSManagedObjectStackを立ち上げる方法ですが、このコードはAppDelegate.swiftにあって、AppDelegateで数々の機能を発揮できるので、ViewControllerから利用していきます。

この関係性ですが、Swiftで遊ぼう! - 260 - プロトコールとデリゲーション ProtocolsとDelegation - Swiftで遊ぼう! on Hatenaに書かれている「View」と「Controller」の関係性で考えると、AppDelegateがControllerにあたり、ViewControllerがViewになります。AppDelegateが処理を任された「デリゲート」クラスです。

AppDelegateの機能を利用するステップは、「6ステップ プロトコール・デリゲーション実装法」のステップ2とステップ3です。

ViewControllerクラスを選択します。

このプロジェクトでUIを使いません。Core Dataの挙動だけを確認してくので、全てのコードをviewDidLoad()メソッド内で動かします。←この意味が分からなければ、もう少し基本事項を勉強してからトライして下さい。

「import CoreData」を加えることを忘れないように。

そして、viewDidLoad()メソッド内に次のコードを加えます。

override func viewDidLoad() {
  super.viewDidLoad()
        
  let appDelegate: AppDelegate = 
      UIApplication.sharedApplication().delegate as! AppDelegate
  let context: NSManagedObjectContext = 
      appDelegate.managedObjectContext
....

デリゲートの機能を使うためにViewControllerでデリゲートプロパティとしてインスタンス化させます。当然、重複を避けるためのシングルトン・パターンです。そして、NSManagedObjectStackの主要コンテンツであるNSManagedObjectContextを使用します。これがデータの永続的書き込みとデーターベースから値の取り出しをするんです。

そのまま新しい値を加えるコードを書きます。

.....
var newValue = 
     NSEntityDescription.insertNewObjectForEntityForName("Users", 
                  inManagedObjectContext: context)
newValue.setValue("Yuji", forKey: "username")
newValue.setValue("123456", forKey: "password")
        
do {
    try context.save()
   } catch let error as NSError {
     print("Error: \(error)")
   }
.....

このコードが新しいデータを加えるステップです。重要なクラスメソッドを覚えなければなりません。

  • NSEntityDescription.insertNewObjectForEntityForName(, inManagedObjectContext:)
  • setValue(, forKey:)

この2つを覚えます。

もう1つNSManagedObject型の値を加える一般的な方法も覚えます。

.....
let entity  = 
     NSEntityDescription.entityForName("Users", 
                  inManagedObjectContext: context)
let user = 
     NSManagedObject(entity: entity!, 
         insertIntoManagedObjectContext: context)
user.setValue("Genki", forKey: "username")
user.setValue("45678", forKey: "password")
        
do {
    try context.save()
   } catch let error as NSError {
     print("Error: \(error)")
   }
.....

こちらの方が「var」を使わない実装法なので好まれるのでしょうか。空のエンティティを作って、その後に空のNSManagedObjectを作ってから値を代入...

コードミスしそうですね。コードミスをしないようにNSManagedObjectサブクラスを使うといいんですね。

今日はここまで。