使用Swift 3在Xcode 8中寻找关于修订的NSPersistentContainer的清晰教程

Mic*_*ito 8 core-data ios swift3 xcode8

我查看了Apple的:

Xcode 8发行说明:https:
//developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html

从Swift 2.2迁移到Swift 2.3或Swift 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

还有很多其他......但是,应该从Apple的核心数据编程指南中获得的一个文档尚未从Swift 2更新
.https://developer.apple.com/library/content/documentation/Cocoa/概念/ 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)")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3)创建实体"Foo"

4)添加属性"bar"类型String

5)在ViewController.swift下添加以下内容(这是从Apple复制的,我只是将"... use"替换为"print")

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

6)在override func viewDidLoad()下添加findAnimals().

但是这有错误:

  1. NSFetchRequest <使用未声明的类型'NSFetchRequest'
  2. context <使用未解析的标识符'context'

7)所以你回去此的viewController下添加了一些功能,使访问的容器(这是不是在本例中形成苹果).

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
Run Code Online (Sandbox Code Playgroud)

很好,我们清除了2错误中的1,但错误"使用未声明的类型'NSFetchRequest'"仍然存在.

这就是我被困住的地方.即使在审查了所有Apple发布的材料后,我也找不到完整的例子.

Mic*_*ito 7

@Aaron再次感谢视频链接,让我走上正轨.下面是使用Xcode 8中的Swift 3从核心数据中获取,添加和清除所需的最低限度.

  1. 新项目> iOS单一视图应用程序
  2. 产品名称:"样品"
  3. 使用核心数据(已选中)
  4. 保存
  5. 打开Sample.xcdatamodeld
  6. 添加和实体:"SampleEntity"
  7. 使用数据模型检查器将Codegen(在Class下)设置为"Class Definition"
  8. 在新实体下创建一个属性:"sampleAttribute"
  9. 打开ViewController.swift
  10. 在"import UIKit"下添加"import CoreData"
  11. 在Class 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. 在override 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


Aar*_*ron 2

也许今年 WWDC What's New in Core Data的视频可以让你了解更多内幕。

大约在 31:20 分钟,他展示了一些有关NSFetchRequest.