2016-05-20 2 views
0

こんにちは、これは可能かどうか疑問に思っています。カウンタの変数がボタンを押すたびに1ずつインクリメントされる単純なカウンタアプリケーションがあります。ユーザーがコアデータを使用してアプリケーションを終了したときにカウンタを保存することは可能ですか?私はNSUserdefaultsはここで働いてます知っているが、イムは、コアデータを探索し、それがこのコアデータを使用して素早く変化する整数を保存する

class ViewController: UIViewController { 

var counter = Int() 


@IBOutlet var label: UILabel! 

@IBAction func button(sender: AnyObject) { 
    counter += 1 
    label.text = "\(counter)" 



} 
override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view, typically from a nib. 
} 
} 

NSManagedObjectのサブクラスエラー

class IntegerEntity: NSManagedObject { 


convenience init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?, value: Int) { 
    self.init(entity: entity, insertIntoManagedObjectContext: context) 
    self.value 
    // ERROR value of type IntegerEntity has no member value 
} 
} 

ViewController.swiftエラー

import UIKit 
import CoreData 

class ViewController: UIViewController { 

var counter = Int() 


@IBOutlet var label: UILabel! 

@IBAction func button(sender: AnyObject) { 
    counter += 1 
    label.text = "\(counter)" 



} 
override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view, typically from a nib. 
} 

override func viewWillDisappear(animated: Bool) { 
    super.viewWillDisappear(animated) 

    let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext 
    var integerEntity: IntegerEntity! 
    if dataContext != nil { 
     let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext) 
     let request = NSFetchRequest() 
     request.entity = entity 
     let integer = try? dataContext.executeFetchRequest(request) 

     if integer != nil && !integer!.isEmpty { 
      (integer?.first! as! IntegerEntity).value = counter 
      // ERROR value of type IntegerEntity has no member value 
     } else { 

      let newInt = IntegerEntity(entity: entity, insertIntoManagedObjectContext: context, value: counter) 
      // ERROR Use of unresolved identifier context 

      dataContext.saveData() 
     } 
    } 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext 
    var integerEntity: IntegerEntity! 
    if dataContext != nil { 
     let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext) 
     let request = NSFetchRequest() 
     request.entity = entity 
     let integer = try? dataContext.executeFetchRequest(request) 

     if integer != nil && !integer!.isEmpty { 
      counter = (integer!.first! as! IntegerEntity).value 
      // ERROR value of type IntegerEntity has no member value 
     } else { 

      counter = 0 
     } 
    } 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 
extension NSManagedObjectContext { 
func saveData() -> Bool { 
    do { 
     try self.save() 
     return true 
    } catch let error as NSError { 
     print(error) 
     return false; 
    } 
} 
} 
+0

はい、もちろんです。しかし、それはタスクにとって非常に悪いマッチです。それは店の向こうにミルクの瓶のために行くために747を起動するようなものです。コアデータは非常に強力ですが、急な学習曲線とかなりのオーバーヘッドがあります。それを使用して単一の整数を格納するのは愚かです。 –

+0

'do-catch'を使い、エラーを適切に処理します。成功すると、オプションでない配列が保証されます。また、 'NSManagedObjectContext'オブジェクトも非オプションであると考えられます。そして、 'AppDelegate'はどのように' nil'になることができますか?アプリケーションデリゲートがない場合、アプリケーションはまったく起動しません。 – vadian

答えて

0
のような場合に使用することができればと思いまして

これは可能です。

まず、コアデータモデルを作成し、IntegerEntityというエンティティを追加します。エンティティで、タイプがInteger 64valueというプロパティを追加します。今すぐNSManagedObjectサブクラスを生成します。

IntegerEntity,swiftでは、以下の初期化子を追加:後に、我々は値を持つエンティティを作成するには、直接これを使用することができますので、

convenience init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?, value: Int) { 
    self.init(entity: entity, insertIntoManagedObjectContext: context) 
    self.value = value 
} 

これがあります。

あなたがデータを保存する際の二つの選択肢持っているので、私は、あなたのアプリが唯一のビューコントローラを持っていたとします

  • をデータごとに60秒または他の時間間隔
  • を保存するためにNSTimerを使用して、ビューコントローラでviewDidDisappearをオーバーライドするか、アプリデリゲートでapplicationWillResignActiveをオーバーライドします。

データを保存するには、保存されている整数を元に戻す必要があります(存在する場合)。

// Just some boilerplate code here 
let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext 
var integerEntity: IntegerEntity! 
if dataContext != nil { 
    let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext) 
    let request = NSFetchRequest() 
    request.entity = entity 
    let integer = try? dataContext.executeFetchRequest(request) 
    // If some integer has already been saved... 
    if integer != nil && !integer.isEmpty { 
     (integer?.first! as! IntegerEntity).value = counter 
    } else { 
     // If no integer has been saved before... 
     let newInt = IntegerEntity(entity: entity, insertIntoManagedObjectContext: context, value: counter) 
     dataContext.saveData() 
    } 
} 

saveDataは何ですか? Xcodeの私のバージョンにはバグがあると思います。 Xcodeは、常にsave()メソッドがエラーをスローし、Voidを返すと主張しています。そこで、私はこの拡張を作成しました:

extension NSManagedObjectContext { 
    func saveData() -> Bool { 
     do { 
      try self.save() 
      return true 
     } catch let error as NSError { 
      print(error) 
      return false; 
     } 
    } 
} 

そして、BOOM!それでおしまい!

"データを取得するにはどうすればよいですか?"あなたは尋ねました。実際に、あなたはそれを前にやった!コードは次のとおりです。

let dataContext: NSManagedObjectContext! = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext 
    var integerEntity: IntegerEntity! 
    if dataContext != nil { 
     let entity = NSEntityDescription.entityForName("IntegerEntity", inManagedObjectContext: dataContext) 
     let request = NSFetchRequest() 
     request.entity = entity 
     let integer = try? dataContext.executeFetchRequest(request) 
     // If some integer has already been saved... 
     if integer != nil && !integer.isEmpty { 
      counter = (integer!.first! as! IntegerEntity).value.integerValue 
     } else { 
      // If no integer has been saved before... 
      counter = 0 
     } 
    } 

よく知られていますか?以前とほぼ同じコードです!

WARNING

IMO、それはちょうどあなたが知っているだけのように1つの整数を保存するので、多くのコードを記述する価値はありません。代わりにユーザーのデフォルトを使用してください。コアデータを調べたい場合は、コアデータに単語のリストを保存してみてください。そして、ボタンを押すと、AVSpeechSynthesizerはすべて声を出して読み上げます。

+0

すごく感謝してくれてありがとうございます。私の質問は、エラーが表示されたコメントを使用して編集されました。すみません。私は素早く素早く素敵です。 –

+0

IntegerEntity.swiftを生成しましたか?File - > New - > New Fileを使って作成しましたか?あなたはそうしてはいけません。最初に自分で作成したファイルを削除します。その後、あなたのデータモデルを開いて、エディタ - > NSManagedObjectサブクラスを生成...をクリックし、それはOKであるはずです。 @MattWyeth – Sweeper

+0

@MattWyeth NSManagedObjectサブクラスを生成するには、Editor - > Generate NSManagedObjectサブクラスを使用するか、手動でファイルを作成しただけですか?手動でファイルを作成した場合は、前に述べたとおり、ファイルを削除して正しい方法を使用する必要があります。 – Sweeper

関連する問題