2014-09-04 17 views
15

Tôi hiện đang sử dụng Xcode 6 beta 7 và quyết định tôi cần CoreData sau khi đã tạo dự án của mình. Tôi đã xem xét một số câu hỏi đã yêu cầu này cho mục tiêu C cùng với xem video về chủ đề này nhưng tôi dường như nhận được cùng một lỗi. Đối với việc sử dụng khung công tác CoreData, tôi khá chắc chắn rằng nó là chính xác khi tôi tạo một dự án trống khác (với hộp CoreData được chọn) và thực hiện tương tự và nó hoạt động như một nét duyên dáng nhưng có thể có điều gì đó sai đang làm ở đó. Vì vậy, đây là các bước tôi theo sau để triển khai CoreData trong dự án của tôi trong Swift.Triển khai CoreData vào một dự án hiện có bằng Swift

Bước 1: Tôi thêm khuôn khổ CoreData qua "Liên kết Binary với Libraries" tab dưới "Xây dựng giai đoạn"

Bước 2: Sau đó tôi đi đến bất kỳ tập tin .swift tôi mà sẽ cần phải thực hiện CoreData (appdelegate .swift và một tệp khác như bây giờ) và thêm dòng:

import CoreData 

lên trên cùng.

Bước 3: Tôi đã tạo danh sách dữ liệu với một thực thể có tên là "cData", sau đó tạo một lớp cho nó được gọi là "data.swift". Dưới đây là data.swift:

import UIKit 
import CoreData 

@objc(data) 
class data: NSManagedObject { 
    @NSManaged var something : String 
} 

Bước 4: Tôi đã viết code để thực sự lưu dữ liệu trong tập tin khác:

@IBAction func useCoreData(sender: AnyObject) 
    { 
     let AD : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
     let ct : NSManagedObjectContext = AD.managedObjectContext! 
     let ent = NSEntityDescription.entityForName("CData", inManagedObjectContext: ct) 
     var dat = data(entity: ent!, insertIntoManagedObjectContext: ct) 
     dat.something = someTextField.text 
     ct.save(nil) 

     println(dat) 
    } 

Bước 5: Đây là nơi mà tôi tin rằng tôi sai lầm, mặc dù tôi có thể sai. Tôi đã tạo một dự án mới trên một máy Mac riêng biệt (vì vậy tôi có thể đặt tên nó giống như vậy) và kiểm tra hộp CoreData. Sau đó tôi đã sao chép toàn bộ appDelegate.swift từ dự án này sang dự án hiện tại của tôi. Dưới đây là appDelegate.swift tôi:

import UIKit 
import CoreData 

@UIApplicationMain 

class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 
     return true 
    } 

    func applicationWillResignActive(application: UIApplication) { 
     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
    } 

    func applicationDidEnterBackground(application: UIApplication) { 
     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    } 

    func applicationWillEnterForeground(application: UIApplication) { 
     // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 
    } 

    func applicationDidBecomeActive(application: UIApplication) { 
     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    } 

    func applicationWillTerminate(application: UIApplication) { 
     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
     // Saves changes in the application's managed object context before the application terminates. 
     self.saveContext() 
    } 

    // MARK: - Core Data stack 

    lazy var applicationDocumentsDirectory: NSURL = { 
     // The directory the application uses to store the Core Data store file. This code uses a directory named "y.Simple_Grade" in the application's documents Application Support directory. 
     let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
     return urls[urls.count-1] as NSURL 
     }() 

    lazy var managedObjectModel: NSManagedObjectModel = { 
     // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. 
     let modelURL = NSBundle.mainBundle().URLForResource("my_app", withExtension: "momd")! 
     return NSManagedObjectModel(contentsOfURL: modelURL) 
     }() 

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
     // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. 
     // Create the coordinator and store 
     var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
     let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("my_app.sqlite") 
     var error: NSError? = nil 
     var failureReason = "There was an error creating or loading the application's saved data." 
     if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { 
      coordinator = nil 
      // Report any error we got. 
      let dict = NSMutableDictionary() 
      dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
      dict[NSLocalizedFailureReasonErrorKey] = failureReason 
      dict[NSUnderlyingErrorKey] = error 
      error = NSError.errorWithDomain("YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
      // Replace this with code to handle the error appropriately. 
      // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
      NSLog("Unresolved error \(error), \(error!.userInfo)") 
      abort() 
     } 

     return coordinator 
     }() 

    lazy var managedObjectContext: NSManagedObjectContext? = { 
     // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. 
     let coordinator = self.persistentStoreCoordinator 
     if coordinator == nil { 
      return nil 
     } 
     var managedObjectContext = NSManagedObjectContext() 
     managedObjectContext.persistentStoreCoordinator = coordinator 
     return managedObjectContext 
     }() 

    // MARK: - Core Data Saving support 

    func saveContext() { 
     if let moc = self.managedObjectContext { 
      var error: NSError? = nil 
      if moc.hasChanges && !moc.save(&error) { 
       // Replace this implementation with code to handle the error appropriately. 
       // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
       NSLog("Unresolved error \(error), \(error!.userInfo)") 
       abort() 
      } 
     } 
    } 
} 

Khi phương pháp IBAction "useCoreData" được gọi, tôi nhận được một vụ tai nạn và các ngoại lệ khẳng định "lỗi nghiêm trọng: bất ngờ tìm thấy con số không trong khi unwrapping một giá trị bắt buộc (LLĐB)" và bang dòng vi phạm là trong appDelegate.swift:

let modelURL = NSBundle.mainBundle().URLForResource("my_app", withExtension: "momd")! 

một lần nữa, khi tôi cố gắng thực hiện này CoreData cùng trong một dự án khác mà có hộp CoreData kiểm tra ngay từ đầu đi, nó hoạt động như một nét duyên dáng. Tôi đã nhìn thấy một câu hỏi tương tự như thế này (người dùng đã nhận được cùng một lỗi), nhưng nó không có vẻ như vấn đề của ông đã được giải quyết một trong hai.

+0

Tôi không biết rằng tệp đó còn tồn tại, ở đâu trong dự án tôi có thể tìm thấy? – yaboi

+1

Điều này ngăn chặn sự cố, cảm ơn bạn! Tôi thay đổi dòng để phù hợp với tên của mô hình dữ liệu của tôi tập tin – yaboi

+1

không có vấn đề; đã chỉnh sửa –

Trả lời

15

Bạn nhận được một giá trị nil ở đó vì tệp tìm kiếm không tồn tại trong gói chính của bạn.

Bạn cần phải sao chép tệp mô hình dữ liệu của mình từ dự án khác mà bạn đã tạo cho dự án chính của mình. Các tập tin sẽ được gọi là một cái gì đó giống như My_App.xcdatamodeld và nên được đặt trong cùng một thư mục mà tập tin dự án Xcode của bạn là trong

Lưu ý:. Dòng URLForResource đang tìm kiếm My_App.momd; tập tin đó được tạo bởi Xcode từ My_App.xcdatamodeld khi nó biên dịch dự án của bạn.

+0

Vẫn gặp sự cố này. Xcode không thể tìm thấy tệp trong gói chính?Tôi xác minh rằng nó tồn tại trong gói chính của tôi và cũng trong cùng thư mục với tệp dự án Xcode của tôi. –

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