2016-09-20 49 views
8

我查看了蘋果的:與斯威夫特在Xcode 8尋找關於修訂NSPersistentContainer明確教程3

的Xcode 8發行說明:
https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html

從雨燕2.2遷移到雨燕2.3或斯威夫特3
https://swift.org/migration-guide/

什麼在MacOS上10.12,iOS的10.0,tvOS 10.0中的新核心數據,並watchOS 3.0
https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html#//apple_ref/doc/uid/TP40017342-CH1-DontLinkElementID_1

和很多人一樣......但一個文件,應該可以從蘋果公司的核心數據編程指南,尚未從斯威夫特2.
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/FetchingObjects.html#//apple_ref/doc/uid/TP40001075-CH6-SW1

理想我正在尋找這樣的事情更新但對於Swift 3.
https://www.raywenderlich.com/115695/getting-started-with-core-data-tutorial

任何潛在客戶都將非常感激。

每湯姆的評論(下)我缺少什麼步驟?

1)創建一個新項目 「測試」

2)選擇使用CoreDate(這將創建Test.xcdatamodeld)

這將自動填充的AppDelegate與以下(默認評論刪除):

func applicationWillTerminate(_ application: UIApplication) { 
self.saveContext() 
} 
lazy var persistentContainer: NSPersistentContainer = { 
    let container = NSPersistentContainer(name: "Test") 
    container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
     if let error = error as NSError? { 
      fatalError("Unresolved error \(error), \(error.userInfo)") 
     } 
    }) 
    return container 
}() 
func saveContext() { 
    let context = persistentContainer.viewContext 
    if context.hasChanges { 
     do { 
      try context.save() 
     } catch { 
      let nserror = error as NSError 
      fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
     } 
    } 
} 

3)創建實體 「富」

4)添加屬性 「欄」 String類型

5)在ViewController.swift添加以下(這是從蘋果抄襲,我剛剛更換 「......用」 與 「打印」)

func findAnimals() { 
    let request: NSFetchRequest<Foo> = Foo.fetchRequest 
    do { 
     let searchResults = try context.fetch(request) 
     print(searchResults) 
    } catch { 
     print("Error with request: \(error)") 
    } 
} 

6)加入findAnimals()下覆蓋FUNC viewDidLoad中()。

但是這個具體有錯誤:

  1. NSFetchRequest <使用未聲明的類型 'NSFetchRequest'
  2. 方面<使用未解決的標識符 '語境'

7),這樣你回去在viewController下的函數中加入一些東西,使容器可以訪問(這不在Apple的示例中)。

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

很好,我們清除了2錯誤中的1個,但錯誤「使用未聲明的類型'NSFetchRequest'」仍然存在。

這裏是我卡住的地方。即使在審查了Apple發佈的所有材料之後,我也找不到完整的示例。

+0

你有什麼具體的不明白? –

+0

有限的文檔意味着所有人必須做的是在xcdatamodeld中創建一個實體,它會自動識別。不過,我不斷收到「未解決的標識符」。 –

+0

您是否導入CoreData? – shallowThought

回答

2

可能是今年的視頻WWDC What's New in Core Data可以給你更多的內心。

在大約分鐘31:20他顯示了一些關於NSFetchRequest的代碼。

+0

感謝您的鏈接!我看過整個視頻,引起我注意的是演示使用「mater-detail」模板而不是「單視圖」模板。在比較了兩個太陽穴後,我注意到單視圖模板的「Codegen」設置爲「Manual/None」,而不是新的自動「Class definition」設置。更多來! –

7

@Aaron再次感謝視頻鏈接,這讓我走上了正軌。下面是快速穿行的獲取,添加所需的最低限度,並明確從核心數據與斯威夫特3在Xcode 8

  1. 新建項目>的iOS單一視圖應用
  2. 產品名稱:「樣品」
  3. 使用核心數據(選中)
  4. 保存
  5. 打開Sample.xcdatamodeld
  6. 添加和實體: 「SampleEntity」
  7. 使用數據模型檢查器設置代碼根(下類)「類定義」
  8. 創建新的實體下一個屬性:「sampleAttribute」
  9. 打開ViewController.swift
  10. 在「進口UIKit的」添加「導入CoreData」
  11. 課下ViewController中添加以下內容:

    let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    
    // Get data from he attribute 
    func getSample() { 
        let request: NSFetchRequest = SampleEntity.fetchRequest() 
        request.resultType = NSFetchRequestResultType.dictionaryResultType 
        do { 
         let searchResults = try context.fetch(request as! NSFetchRequest<NSFetchRequestResult>) as! [NSDictionary] 
         let searchResultsArray = searchResults.map { $0["sampleAttribute"] as! String} 
         print("searchResultsArray", searchResultsArray) 
        } catch { 
         print("Error with request: \(error)") 
        } 
    } 
    
    // Save to the attribute 
    func setSample() { 
        let saveSample = SampleEntity(context: context) 
        saveSample.sampleAttribute = "Save a new string." 
        do { 
         try context.save() 
        } catch { 
         print("Error with save: \(error)") 
        } 
    } 
    
    // clear the attribute 
    func resetSample() { 
        let clearSample: NSFetchRequest = SampleEntity.fetchRequest() 
        let deleteResults = NSBatchDeleteRequest(fetchRequest: clearSample as! NSFetchRequest<NSFetchRequestResult>) 
        do { 
         try context.execute(deleteResults) 
         try context.save() 
        } catch { 
         print("Error with save: \(error)") 
        } 
    }
  12. 在覆蓋FUNC viewDidLoad中()增加以下內容:

    getSample() 
    setSample() 
    getSample() 
    resetSample() 
    getSample()
  13. 運行,你會看到下面印在調試區:

    searchResultsArray []      // Initially the attribute is empty 
    searchResultsArray ["Save new string."]  // The attribute now contains the string 
    searchResultsArray []      // This attribute has been cleared
0

從我的理解,NSPersistentContainer解耦以簡單的方式主要環境和工人的上下文。可以簡單地調用container.viewContext來獲取任何UI級別的數據訪問(舊的NSMainQueueConcurrencyType),並使用container.newBackgroundContext進行其他數據導入工作(舊的NSPrivtaeQueueConcurrencyType)。並且通過將automaticallyMergesChangesFromParent設置爲對任何上下文成立,它等於老聽NSManagedObjectContextDidSaveNotification

參考:http://holko.pl/2016/06/23/core-data/

0

我還是不能發表評論。所以讓我把它放在這裏。 我相信這兩個視頻會幫助你很多。 Paul Hegarty的大斯坦福大學課程是最新的!

https://www.youtube.com/watch?v=ssIpdu73p7A - 關於CoreData的講座 https://www.youtube.com/watch?v=whF63GTaW1w - 使用CoreData的演示。

+0

我實際上在2016年10月得到了這個工作。您可以通過在AppStore上籤出我的應用程序MathFit來查看我對核心數據所做的工作。 - https://itunes.apple.com/us/app/mathfit/id1173338351?mt=8 –