簡體   English   中英

核心數據上下文未保存

[英]Core Data Context not Saving

我一直在努力讓Core Data在我的移動應用程序中正常工作。 在我進行所有修復后,這些值始終保持為零。 這是用於保存我的信息的相關信息,請注意,在任何時間點只會有一個結果。

var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
var context:NSManagedObjectContext = appDel.managedObjectContext!
let insertBools = NSEntityDescription.insertNewObjectForEntityForName("Codes", inManagedObjectContext: context) as NSManagedObject

在基於掃描的QR碼進行字符串檢查比較之后,在代碼的后面...

else if (metadataObj.stringValue == "oiu2162poiu" && res.qrCode5_Found != true) {
    captureSession?.stopRunning()
    println("\(metadataObj.stringValue) qrCode5_Found if")
    insertBools.setValue(true, forKey: "qrCode5_Found")
    var alert = UIAlertController(title: "Code Found!", message: "You have found and scanned Code #5!", preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
    insertBools.managedObjectContext?.save(nil)
    self.navigationController?.popViewControllerAnimated(false)
}

我不確定我要去哪里。 之前的View控制器每次加載時都會檢索每個鍵的值,並根據是否找到了某些元素來顯示某些標簽(這是應用程序的尋寶風格部分)。

override func viewDidLoad() {
    super.viewDidLoad()
    var appDel:AppDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
    var context:NSManagedObjectContext = appDel.managedObjectContext!
    let request = NSFetchRequest(entityName: "Codes")
    request.returnsObjectsAsFaults = false

    var results:NSArray = context.executeFetchRequest(request, error: nil)!

    if (results.count == 1) {
        var res = results[0] as Codes
        if (res.qrCode1_Found != true) {
            qrCode1.enabled = true
            scanQRCodeButton.enabled = true
            qrLeftList.enabled = true
        }
        if (res.qrCode2_Found != true) {
            qrCode2.enabled = true
            scanQRCodeButton.enabled = true
            qrLeftList.enabled = true
        }
        if (res.qrCode3_Found != true) {
            qrCode3.enabled = true
            scanQRCodeButton.enabled = true
            qrLeftList.enabled = true
        }
        if (res.qrCode4_Found != true) {
            qrCode4.enabled = true
            scanQRCodeButton.enabled = true
            qrLeftList.enabled = true
        }
        if (res.qrCode5_Found != true) {
            qrCode5.enabled = false
            scanQRCodeButton.enabled = true
            qrLeftList.enabled = true
        }
        if (res.qrCode5_Found == true && res.qrCode4_Found == true && res.qrCode3_Found == true && res.qrCode2_Found == true && res.qrCode1_Found == true) {
            registerButton.enabled = true
            scanQRCodeButton.enabled = false
        }
    }
........

還有我的AppDelegate文件,最初我沒有包含Core Data,但是我全部手動導入了它,並且編譯器沒有引發任何錯誤。

//
//  AppDelegate.swift
//  webview_test
//
//  Created by Robert on 3/19/15.
//  Copyright (c) 2015 Robert. All rights reserved.
//

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 inactive 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.
}
// 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 "com.xxxx.ProjectName" 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("SavedVariables", 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("webview_test.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.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason
        dict[NSUnderlyingErrorKey] = error
        error = NSError(domain: "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()
        }
    }
}

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()
}

}

作為一個旁注...如果有人可以告訴我如何迫使程序等待用戶按警報上的“確定”按鈕,然后再繼續操作,我將永遠背負債務。

我誤解了核心數據的概念。 相反,我現在遍歷每個結果而不是

var res = results[0] as Codes

for res in results as [NSManagedObject] {
    ....
}

並得到我需要的結果,然后將其用於比較,這是一個比較差的工作,但它可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM