Xcode Swift CoreData有问题保存和调用数据

时间:2017-03-29 06:13:01

标签: swift core-data save fetch

所以在我的应用程序中它是一个多视图控制器教程。通过在角色扮演游戏中构建角色来走动一个人。我得到了创建记录的第一点,我尝试使用我工作的其他项目来保存数据并调用数​​据。现在,当我处理CoreData时,我只处理了字符串。我不确定调用数据时有多大不同。

首先,用户确实插入了字符编号。然后他们选择他们的模式,然后他们的能力得分,然后他们的比赛等等。因此,当用户使用字符编号到达ViewController时,会为他们预先生成一个字符编号,如果需要,他们可以更改它。他们点击继续,然后创造了记录。当他们到达ModeViewController时,他们有2个按钮,核心或标准。当他们选择按钮时,它应该根据字符编号调用记录,然后用所选模式更新记录。 这是ModeViewController的代码:

    // Passed in variables from other ViewControllers
    var characterNumber = 0

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


@IBAction func standardBtn(_ sender: Any)
    {
        let pred = NSPredicate(format: "(name = %@)", "characterNumber")
        print("Character Numeber: ", characterNumber)

        let fetchRequest = NSFetchRequest<Characters>(entityName: "Characters")
        fetchRequest.predicate = pred

        do
        {
            let fetchedEntities = try self.managedObjectContext.fetch(fetchRequest as! NSFetchRequest<NSFetchRequestResult>) as! [Characters]

            // Character Information
            fetchedEntities.first?.mode = "standard"

            performSegue(withIdentifier: "mode", sender: nil)
        }
        catch
        {
            // Do something in response to error condition
            let alertController = UIAlertController(title: "Did Not Save", message:
                "Your information did not save. \nIf this problem keeps occuring, contact the developer", preferredStyle: UIAlertControllerStyle.alert)
            alertController.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default,handler: nil))

            self.present(alertController, animated: true, completion: nil)
        }

        do
        {
            try self.managedObjectContext.save()
        }
        catch
        {
            // Do something in response to error condition
        }
    }

在CoreData中 实体:角色 属性:characternumber(int16)

现在核心的另一个按钮具有相同的确切代码,除了不保存标准,它保存核心。

这是我应该根据字符数据调用数据的代码:

    // Passed in variables from other ViewControllers
    var characterNumber = 0

    // Other variables
    let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    var mode: [NSManagedObject] = []
    var selectededMode = ""


   let entityDescription = NSEntityDescription.entity(forEntityName: "Characters", in: managedObjectContext)

    let request: NSFetchRequest<Characters> = Characters.fetchRequest()
    request.entity = entityDescription

    // Supposed to call the record based on characternNumber
    let pred = NSPredicate(format: "(characternumber = %@)", "characterNumber")
    request.predicate = pred

    do
    {
        var results = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)

        print("results = ", results)

        if results.count > 0
        {
            let match = results[0] as! NSManagedObject

            print("match= ", match)

            selectededMode = (match.value(forKey: "mode") as? String)!
            print("Mode: ",  selectededMode)
        }
        else
        {
            selectededMode = "empty"
            print("Mode: ",  selectededMode)
        }

现在我认为我的主要问题是数据没有将我选择的模式保存到coredata中。我再次处理字符串,现在冒险进入整数。

创建实际记录:

@IBAction func savingSocNum(_ sender: Any)
{
    if societyNumberTxt.text == ""
    {
        let alert = UIAlertController(title: "No Society Number", message: "You have not entered your Society Nmber.\nPlease enter your Society Number to advance", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
        self.present(alert, animated: true, completion: nil)
    }
    else
    {
        let entity = NSEntityDescription.entity(forEntityName: "Characters", in: managedObjectContext)!
        let entity1 = NSEntityDescription.entity(forEntityName: "Societynumber", in: managedObjectContext)!

        let cnumber = NSManagedObject(entity: entity, insertInto: managedObjectContext)
        let snumber = NSManagedObject(entity: entity1, insertInto: managedObjectContext)

        let newCharNum = Int(characterNumberTxt.text!)!


        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return
        }

        let managedContext = appDelegate.persistentContainer.viewContext

        //2
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Societynumber")

        do {
            societyNum = try managedContext.fetch(fetchRequest)

            // Fetchs data from Characters
            let entityDescription = NSEntityDescription.entity(forEntityName: "Societynumber", in: managedObjectContext)

            let request: NSFetchRequest<Societynumber> = Societynumber.fetchRequest()
            request.entity = entityDescription

            var results = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)

            if societyNum.isEmpty
            {
                print("empty")
            }
            else
            {
                print("not empty")
            }

        } catch let error as NSError {
            print("Could not fetch. \(error), \(error.userInfo)")
        }



        snumber.setValue(societyNumberTxt.text, forKeyPath: "societynumber")
        cnumber.setValue(newCharNum, forKey: "characternumber")

        do
        {
            try managedObjectContext.save()
            characters.append(cnumber)
        }
        catch let error as NSError
        {
            print("Could not save. \(error), \(error.userInfo)")
        }

        performSegue(withIdentifier: "continue", sender: nil)
    }
}

0 个答案:

没有答案