2016-05-20 44 views
0

嗨,只是想知道這是否可能,我有一個簡單的計數器應用程序,每次按下按鈕時,計數器變量都會加1。當用戶使用核心數據退出應用程序時可以保存計數器嗎?我知道會NSUserDefaults的在這裏工作,但IM探索的核心數據,並想知道它是否能在情況下可以使用這樣使用核心數據來保存一個不斷變化的整數

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的實體。在實體中,添加名爲value的屬性,其類型爲Integer 64。現在生成NSManagedObject子類。

IntegerEntity,swift,添加以下初始化:

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

這是因爲後面,我們可以用這個直接用一個價值創造的實體。

我想你的應用程序只有一個視圖控制器,所以你的時候,保存數據的兩個選項:

  • 使用一個NSTimer保存數據每60秒或其他時間間隔
  • 覆蓋視圖控制器中的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 
     } 
    } 

看起來很熟悉嗎?它幾乎和以前一樣!

警告

IMO,它不值得寫了這麼多代碼只是爲了救一個單獨的整數,只是讓你知道。改用用戶默認值。如果您想探索Core Data,可以嘗試在Core Data中保存單詞列表。然後按下一個按鈕,AVSpeechSynthesizer大聲朗讀。

+0

嗨,感謝您的真棒回覆,我的代碼雖然實現了一些錯誤。我使用標記爲// ERROR的註釋編輯了我的問題。對不起,我非常新鮮,所以忍耐着我:) –

+0

您是否生成'IntegerEntity.swift'或者您是否使用文件 - >新建 - >新建文件創建了一個?你不應該那樣做。首先刪除你自己創建的文件。然後打開你的數據模型,然後點擊編輯器 - >生成NSManagedObject子類...然後它應該可以。 @MattWyeth – Sweeper

+0

@MattWyeth我的意思是你使用編輯器生成NSManagedObject子類 - >生成NSManagedObject子類,或者你只是手動創建文件?如果您手動創建了這些文件,則應該刪除它並使用正確的方法,如前所述。 – Sweeper