2016-09-20 31 views
8

tôi đã xem xét Apple:Tìm kiếm một hướng dẫn rõ ràng về NSPersistentContainer sửa đổi trong Xcode 8 với Swift 3

Xcode 8 Release ghi chú:
https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html

Di chuyển sang Swift 2.3 hoặc Swift 3 từ Swift 2.2
https://swift.org/migration-guide/

Có gì mới trong lõi dữ liệu trong hệ điều hành MacOS 10.12, iOS 10,0, tvOS 10,0, và watchos 3,0
https://developer.apple.com/library/content/releasenotes/General/WhatNewCoreData2016/ReleaseNotes.html#//apple_ref/doc/uid/TP40017342-CH1-DontLinkElementID_1

Và nhiều người khác ... nhưng một trong những tài liệu mà nên có sẵn từ Apple, Hướng dẫn lập trình Core Data, chưa được cập nhật từ Swift 2.
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/FetchingObjects.html#//apple_ref/doc/uid/TP40001075-CH6-SW1

Lý tưởng nhất là tôi đang tìm kiếm một cái gì đó như thế này nhưng đối với Swift 3.
https://www.raywenderlich.com/115695/getting-started-with-core-data-tutorial

Bất kỳ khách hàng tiềm năng nào cũng sẽ được đánh giá cao.

Nhận xét của Tom (bên dưới) Tôi đang bỏ lỡ bước nào?

1) Tạo một dự án mới "Test"

2) Chọn sử dụng CoreDate (Điều này tạo ra Test.xcdatamodeld)

này sẽ tự động cư appdelegate như sau (bình luận mặc định loại bỏ):

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) Tạo thực thể "Foo"

4) Thêm Thuộc tính "thanh" kiểu string

01.235.

5) Theo ViewController.swift thêm như sau (Điều này đã được sao chép từ Apple, tôi chỉ thay thế "... sử dụng" với "in")

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

6) Thêm findAnimals() dưới override func viewDidLoad().

Tuy nhiên điều này có lỗi cụ thể:

  1. NSFetchRequest < Sử dụng kiểu khai báo 'NSFetchRequest'
  2. bối cảnh < Sử dụng chưa được giải quyết định 'bối cảnh'

7) Vì vậy, bạn quay trở lại và thêm một cái gì đó này vào hàm dưới viewController để làm cho vùng chứa có thể truy cập được (không có trong mẫu ví dụ của Apple).

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

vĩ đại chúng ta xóa 1 trong những lỗi 2 nhưng lỗi "Sử dụng kiểu khai báo 'NSFetchRequest" vẫn còn.

Và đây là nơi tôi bị kẹt. Ngay cả sau khi xem xét tất cả các tài liệu được xuất bản của Apple, tôi không thể tìm thấy một ví dụ hoàn chỉnh.

+0

Cụ thể bạn không hiểu gì? –

+0

Các tài liệu giới hạn ngụ ý tất cả những gì phải làm là làm cho một thực thể trong xcdatamodeld và nó sẽ tự động được công nhận. Tuy nhiên, tôi liên tục nhận được "số nhận dạng chưa được giải quyết". –

+0

Bạn đã nhập CoreData chưa? – shallowThought

Trả lời

2

Có thể là video của năm này WWDC What's New in Core Data có thể cung cấp cho bạn một số chi tiết bên trong.

Vào khoảng phút 31:20, anh ấy đang hiển thị một số mã liên quan đến NSFetchRequest.

+0

Cảm ơn bạn đã liên kết! Tôi đã xem toàn bộ video và điều khiến tôi chú ý là bản demo sử dụng mẫu "mater-detail" chứ không phải mẫu "xem một lần". Sau khi so sánh hai ngôi đền cạnh nhau, tôi nhận thấy rằng mẫu xem đơn có "Codegen" được đặt thành "Manual/None" thay vì cài đặt "Định nghĩa lớp" tự động mới. Thêm nữa! –

7

@Aaron Cảm ơn bạn lần nữa vì liên kết video đã giúp tôi đi đúng hướng. Dưới đây là nhanh chóng đi bộ qua cho mức tối thiểu cần thiết để lấy, thêm, và rõ ràng từ dữ liệu cốt lõi với Swift 3 trong Xcode 8.

  1. dự án New> iOS Độc xem ứng dụng
  2. Tên sản phẩm: "Mẫu"
  3. Sử dụng dữ liệu Core (kiểm tra)
  4. Lưu
  5. mở Sample.xcdatamodeld
  6. Add và thực thể: "SampleEntity"
  7. Sử dụng thanh tra Data Model để thiết lập luật gen (thuộc Class) để "Class Definition"
  8. Tạo một thuộc tính dưới pháp nhân mới: "sampleAttribute"
  9. mở ViewController.swift
  10. Dưới "nhập khẩu UIKit" add "nhập khẩu CoreData"
  11. Dưới lớp ViewController thêm như sau:

    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. theo ghi đè func viewDidLoad() thêm như sau:

    getSample() 
    setSample() 
    getSample() 
    resetSample() 
    getSample()
  13. Run và bạn sẽ thấy những sản phẩm sau in trong khu vực gỡ lỗi:

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

Từ hiểu biết của tôi, NSPersistentContainer tách riêng bối cảnh chính và bối cảnh người lao động một cách đơn giản. Người ta có thể chỉ cần gọi container.viewContext cho bất kỳ truy cập dữ liệu cấp UI nào (NSMainQueueConcurrencyType cũ) và sử dụng container.newBackgroundContext cho công việc nhập dữ liệu khác (NSPrivtaeQueueConcurrencyType cũ). Và bằng cách đặt automaticallyMergesChangesFromParent thành true cho bất kỳ ngữ cảnh nào, nó bằng với phiên bản cũ nghe NSManagedObjectContextDidSaveNotification.

Tham chiếu: http://holko.pl/2016/06/23/core-data/

0

Tôi vẫn không thể để lại nhận xét. Vì vậy, hãy để tôi đặt nó ở đây. Tôi tin rằng hai video này sẽ giúp bạn rất nhiều. Các khóa học Stanford tuyệt vời của Paul Hegarty được cập nhật!

https://www.youtube.com/watch?v=ssIpdu73p7A - bài giảng về CoreData https://www.youtube.com/watch?v=whF63GTaW1w - bản demo để sử dụng CoreData.

+0

Tôi thực sự đã làm việc này trở lại vào tháng 10 năm 2016. Bạn có thể xem những gì tôi đã làm với dữ liệu cốt lõi bằng cách kiểm tra ứng dụng MathFit của tôi trên AppStore. - https://itunes.apple.com/us/app/mathfit/id1173338351?mt=8 –

Các vấn đề liên quan