2016-05-18 40 views
1

我是CoreData的新手。我建立了一個非常簡單的計數器界面,每次點擊視圖時數字都會增加1。非常簡單。需要實現CoreData,以便該數字在下次打開時保持不變。CoreData - 存儲一個整數,更新按鈕水龍頭

這裏是我的代碼

類級屬性

var timer = Int() 
var name = Int() 
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

viewDidLoad中

override func viewDidLoad() { 
    super.viewDidLoad() 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    do { 
     let request = NSFetchRequest(entityName: "Model") 
     let results = try context.executeFetchRequest(request) 

     for item in results{ 
      let name = item.valueForKey("counter") as! Int 
      print("The counter # saved in Core Data is: \(name)") 
      counterOutlet.text = "\(name)" 

      // Updated 
      if name > timer { 
       timer = name 
      } 
     } 

    } 
    catch { 
     print("Error retrieving from Core Data.") 
    } 
} 

查看螺紋(增加計數器,並保存到CD

@IBAction func tapGestureRecognizerTapped(sender: UITapGestureRecognizer) { 
    timer += 1 
    print(timer) 
    counterOutlet.text = "\(timer)" 

    let context: NSManagedObjectContext = appDel.managedObjectContext 

    // Add stuff to CD 
    let mySavedCounter = NSEntityDescription.insertNewObjectForEntityForName("Model", inManagedObjectContext: context) 
    mySavedCounter.setValue(timer, forKey: "counter") 


    // Add the info to the entity! 
    do { 
     try context.save() 
    } 
    catch { 
     print("Error saving to Core Data.") 
    } 
} 

我的數據模型 xcdatamodel

當我加載應用程序的第一次,計數器爲0(因爲它應該是)。我可以點擊視圖遞增計數器通過1.工作正常。

當我關閉應用程序時,我重新打開它,看看我留在的價值還在那裏! (偉大的!)控制檯日誌顯示以下內容:(一關閉應用程序,一旦我得到15)

The counter # saved in Core Data is: 1 
The counter # saved in Core Data is: 2 
The counter # saved in Core Data is: 3 
The counter # saved in Core Data is: 4 
The counter # saved in Core Data is: 5 
The counter # saved in Core Data is: 6 
The counter # saved in Core Data is: 7 
The counter # saved in Core Data is: 8 
The counter # saved in Core Data is: 9 
The counter # saved in Core Data is: 10 
The counter # saved in Core Data is: 11 
The counter # saved in Core Data is: 12 
The counter # saved in Core Data is: 13 
The counter # saved in Core Data is: 14 
The counter # saved in Core Data is: 15 

現在對於這個問題,我需要調試:

一旦我點擊視圖,計數器重置爲0,並從那裏增加。不應該從15增加,因爲它應該!

我該如何解決這個錯誤,使計數器遞增到保存的數字(在本例中爲15)。此外,我創建了一個NSManagedObject子類,但似乎沒有使用它。上面的代碼是使用幾個YouTube教程創建的。這個代碼可以通過使用子類來優化嗎?每次點擊視圖時將此計數器保存到CD是否是不好的做法?

+0

如果你想堅持的唯一事情是櫃檯,你爲什麼不只是使用而不是NSUserDefaults的帶來的疊CoreData的應用程序? –

+1

@Eugene Zhenya Gordin - 簡短的回答就是我只想練習coredata。還是)感謝你的建議! – Joe

回答

1

您在'tapGestureRecognizerTapped'方法中編寫的代碼錯誤,您不應該在每次點擊後都將新對象插入到核心數據庫中。當插入的對象數爲零時,我會建議在'viewDidLoad'中插入一次對象,否則不要插入。現在,您必須將保存的值存入CoreDatabse並更新該值並將其保存回去。

+0

記住用代碼發佈答案我應該嘗試完成此操作?試着盡我所能解決這個CoreData學習曲線。謝謝! – Joe

0

您正在保存和提取數據 - 但您並未使用先前保存的數據更新timer的值。所以每次都從零開始,因爲在應用程序啓動時你不會告訴它是其他任何東西。

if name > timer { 
    timer = name 
} 

然後timer什麼都能得到最大保存的值:

如果在所有提取後的條目的計劃環,你可以通過添加這樣一行到循環得到timer值是,並從那裏算起。如果您不打算遍歷所有條目,則可以在獲取的陣列上使用reduce來查找最大值。

每次保存值的好壞取決於你的應用應該做什麼。你想爲每個值輸入一個值,還是隻需要一個值?在前一種情況下,這很好,但在後者中,您正在創建不需要的條目。

+0

我只想要一個值。在閱讀你的評論和Santosh's之後,看起來我做得這一切都是錯誤的。我只需要添加一次對象,並將其值更新爲CD。正確? - 編輯:我用你的if語句編輯了我的問題。這將計數器復位的錯誤修復爲零,但是,我仍然需要解決這個問題,因此它的CD效率很高。 – Joe

+0

您是否可以提供關於如何防止爲每個值創建新條目的任何代碼指導?我只想要每次更新CD中存儲的單個值。謝謝! – Joe

+0

您知道如何執行獲取請求。獲取現有條目並查看它是什麼。然後更改該值並保存更改。 –

1

在viewDidLoad中,您將counterOutlet.text設置爲name。 您還必須將計時器設置爲名稱。在viewDidLoad中更新的代碼如下所示:

override func viewDidLoad() { 
    super.viewDidLoad() 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    do { 
     let request = NSFetchRequest(entityName: "Model") 
     let results = try context.executeFetchRequest(request) 

    for item in results{ 
     let name = item.valueForKey("counter") as! Int 
     print("The counter # saved in Core Data is: \(name)") 
     counterOutlet.text = "\(name)" 
     timer = name 
    } 

} 
catch { 
    print("Error retrieving from Core Data.") 
} 
} 
相關問題