核心数据快速一对多关系

ing

我一直在寻找如何处理一对多关系的日子。但我无法弄清楚。

我正在开发一个存储学科成绩的应用程序。因此,一个科目与成绩之间存在多对多的关系。当前所有数据都存储在数组中。

var vakken: [(naam:String, voorkeurGemiddelde:Double, wegingGemiddelde:Double, cijfer:[Double], weging:[Double], gemiddelde:Double)] = []
其中[Double]-Cijfer和weging-是等级的属性。

数据模型

我目前有以下保存数据的方法:

 let context = AppDelegate().managedObjectContext

    // Create subject
    let entitySubject = NSEntityDescription.entityForName("Subject", inManagedObjectContext: context)
    let Subject = NSManagedObject(entity: entitySubject!, insertIntoManagedObjectContext: context)

    // Populate subject
    Subject.setValue(vakken.last!.naam, forKey: "name")
    Subject.setValue(vakken.last!.voorkeurGemiddelde, forKey: "voorkeurGemiddelde")
    Subject.setValue(vakken.last!.wegingGemiddelde, forKey: "wegingNP")
    Subject.setValue(vakken.last!.gemiddelde, forKey: "gemiddelde")

    for var j = 0; j < vakken.last!.cijfer.count-1; j++ {

        let Grade = NSEntityDescription.insertNewObjectForEntityForName("Grade", inManagedObjectContext: context)

        Grade.setValue(vakken.last!.cijfer[j], forKey: "cijfer")
        Grade.setValue(vakken.last!.weging[j], forKey: "weging")

        Subject.setValue(NSSet(object: Grade), forKey: "grade")
    }

    do{
        try context.save()
    }catch{
        print("error")
    }

我在tableView中使用数据。我在一些教程中看到了use : var vakken = [NSManagedObject](),然后在tableview中使用它。
1.但这对于我拥有的模型也是可行的,我应该使用它吗?

我首先想到的是只是在应用终止时保存数据,所以我会将代码保存在应用委托中,然后在应用启动时检索它。

2.但是我如何将阵列发送到appdelegate,这会很聪明吗?

对于获取数据,我有以下内容:

  let fetchRequest = NSFetchRequest(entityName: "Subject")

//        // Add Sort Descriptor
//        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)               
//        fetchRequest.sortDescriptors = [sortDescriptor]


        let context = Appdelegate().managedObjectContext

        // Execute Fetch Request
        do {
            let result = try context.executeFetchRequest(fetchRequest)
            print(result)
        } catch {
            let fetchError = error as NSError
            print(fetchError)
        }

3.但是如何从数组的结果中得到结果,或者如果我使用NSManagedObject,如何引用属性,尤其是等级。

我还按名称对数组进行排序,可以是AZ或ZA,而按平均值可以是10-1或1-10。我有将其排序在数组中的代码。
4.但是我不知道如何用核心数据对它进行排序。

我还看过一个教程,在该教程中,他们为属性链接创建了一个类所以我做了我自己:

    import UIKit
import CoreData
import Foundation

class Subject: NSManagedObject {
    @NSManaged var gemiddelde: Double
    @NSManaged var name: String
    @NSManaged var voorkeurGemiddelde: Double
    @NSManaged var wegingNP: Double
    @NSManaged var Grades: NSSet
}

class Grade: NSManagedObject {
    @NSManaged var cijfer: Double
    @NSManaged var weging: Double
    @NSManaged var subject: Subject
}

extension Subject {
    func addTagObject(value:Grade) {
        let items = self.mutableSetValueForKey("grade");
        items.addObject(value)
    }

    func removeTagObject(value:Grade) {
        let items = self.mutableSetValueForKey("grade");
        items.removeObject(value)
    }
}

5.但是我不知道我是否需要它,也不知道如何使用它?

如果您有任何建议,技巧,熟悉的教程或这些问题之一。您的帮助将不胜感激。

如果您需要更多信息,请告诉我。:)

更新:

我有此代码来获取主题巫婆被单击的对象。

if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = self.fetchedResultsController.objectAtIndexPath(indexPath)
                let controller = segue.destinationViewController as! VakTableViewController
                controller.vak = object as! Subject

            }

这是接收端的代码:

 var vak: Subject! {
    didSet {
        // Update the view.
        cijfers = vak.valueForKeyPath("grades.cijfer")!.allObjects as! [Double]
        wegingen = vak.valueForKeyPath("grades.weging")!.allObjects as! [Double]
        self.tableView.reloadData()
    }
}

var cijfers: Array<Double>!
var wegingen: Array<Double>!

6.但是我该如何删除年级?

我已经试过了:

// Override to support editing the table view.
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        if cijfers.count != 1 {
            let entityGrade = NSEntityDescription.entityForName("Grade", inManagedObjectContext: mangedobjectcontext)
            let grade = Grade(entity: entityGrade!, insertIntoManagedObjectContext: mangedobjectcontext)

            grade.cijfer = cijfers[indexPath.row]
            grade.weging = wegingen[indexPath.row]
            vak.removeGradeObject(grade)
            do{
                try mangedobjectcontext.save()
            }catch{
                print("error")
            }
            cijfers.removeAtIndex(indexPath.row)
            wegingen.removeAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
            print(vak.valueForKeyPath("grades.cijfer")?.allObjects)
        }
    }
}

但这是行不通的。

7.当我只更改变量自己时,如何将vak(subject)保存到上下文中?

像这样:subject.middle = newgerm

pbasdf

要直接解决您的问题:

我在tableView中使用数据。我在一些教程中看到了use : var vakken = [NSManagedObject](),然后在tableview中使用它。我拥有的模型也可以做到吗,我应该使用它吗

当然可以,但是使用可能会更好NSFetchedResultsController(请参阅Apple Docs)。这是专门设计用来使用Core-Data中的数据轻松填充tableView的方法。

我首先想到的是只是在应用终止时保存数据,所以我会将代码保存在应用委托中,然后在应用启动时检索它。我如何将阵列发送到appdelegate,这会很聪明吗?

我不会在App委托中填充/保存数组。有人遵循Apple的模板项目,这些项目在App Delegate中构建CoreData堆栈。其他人有一个单独的类,可以实例化这些类来管理堆栈。从代码的外观来看,它目前使用前者。然后,您的视图控制器可以NSManagedObjectContext使用以下方法从App Delegate获取

let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context = appDelegate.managedObjectContext

(正如beyowulf指出的那样,您不应使用AppDelegate().managedObjectContext它来创建新实例,而应引用现有实例)。一旦有了上下文,您的视图控制器就可以获取所需的数据,添加或更新现有记录等。

但是我如何从数组的结果中得到结果,或者如果我使用NSManagedObject,如何引用属性,尤其是等级。

result是的数组NSManagedObjects您可以使用获得的属性值valueForKey,“读”相当于setValue:(_, forKey:)

let firstObject = result[0]
let firstObjectName = firstObject.valueForKey("name")

同样,可以通过以下方式获得成绩:

let firstObjectGrades = firstObject.valueForKey("grades")

不过,还有更好的方法:请在下面查看您的最后一个问题。

我还按名称对数组进行排序,可以是AZ或ZA,而按平均值可以是10-1或1-10。我有将其排序在数组中的代码。但是我不知道如何用核心数据来排序。

提取数据时,对数据进行排序最容易。为此,NSSortDescriptor为抓取指定一个(请参阅Apple Docs):

let fetchRequest = NSFetchRequest(entityName: "Subject")
fetchRequest.sortDescriptors = [NSSortDescriptor(key:"name", ascending:true)

我还看过一个教程,其中他们为属性创建了一个类。我不知道是否需要它,也不知道如何使用它?

是的,使用它。这将使生活变得更加轻松。不用编写自己的类定义,而是在数据模型编辑器中使用Xcode菜单选项“ Create NSManagedObject subclasses”。它将为您创建类代码,还将设置每个实体使用相应的类。(如果您希望坚持使用自己的代码,则需要在数据模型编辑器中为每个实体修改“类”)。

一旦正确定义了子类,就可以使用点表示法引用属性和关系,而无需使用valueForKeysetValueForKey

所以:

let Subject = NSManagedObject(entity: entitySubject!, insertIntoManagedObjectContext: context)

会变成:

let subject = Subject(entity: entitySubject!, insertIntoManagedObjectContext: context)

(请注意,变量应以小写字母开头-类和实体名称以大写字母开头)。

Grade.setValue(vakken.last!.cijfer[j], forKey: "cijfer")

变成:

grade.cijfer = vakken.last!.cijfer[j]

let firstObjectGrades = firstObject.valueForKey("grades")

变成:

let firstObjectGrades = firstObject.grades

同样,addTagObjectremoveTagObject功能将使管理多对多关系更加容易。您的代码当前具有:

Subject.setValue(NSSet(object: Grade), forKey: "grade")

这将对象替换SubjectGrade对象的任何现有成绩:不会将其添加到现有对象中。实际上,对于一对多关系,管理逆向(一对一)关系要容易得多:

grade.subject = subject

CoreData将自动为您处理逆向(一对多)关系。

如何删除其中一个成绩?

首先,不要为每个Grades属性构建单独的数组:只需为一个属性创建一个数组Grades

var vak: Subject! {
    didSet {
        // Update the view.
        grades = vak.grades.allObjects as! [Grade]
        self.tableView.reloadData()
    }
}

var grades: Array<Grade>!

您可以随时轻松获得属性。例如,cellForRowAtIndexPath您可能会遇到以下情况:

let grade = grades[indexPath.row]
let cijfer = grade.cijfer
let weging = grade.weging
// populate cell labels etc using "cijfer" and "waging"

commitEditingStyle然后,可以轻松找到Grade要删除的内容,并进行相应处理:

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        let grade = grades[indexPath.row]
        // either remove the Grade from your Subject (which leaves
        // the Grade "orphaned"):
        grade.subject = nil
        // or (probably better) completely delete the grade:
        managedobjectcontext.deleteObject(grade)
        // then remove it from the "grades" array:
        grades.removeAtIndex(indexPath.row)
        // and finally delete the corresponding table view row
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        // wrap up by saving the changes to the context:
        do{
            try mangedobjectcontext.save()
        }catch{
            print("error")
        }
    }
}

当我只更改变量之一时,如何将vak(subject)保存到上下文?

每当您保存上下文时,它都会将所有更改保存到向其注册的任何对象(插入到上下文中或使用上下文获取)。因此,即使您所做的唯一更改是修改one的一个属性Subject,也只需调用save()上下文。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

核心数据与一对多关系

来自分类Dev

核心数据一对多关系

来自分类Dev

核心数据不存储数据的一对多关系

来自分类Dev

与iOS核心数据的一对多关系

来自分类Dev

iOS核心数据一对多关系NSSET

来自分类Dev

iOS核心数据一对多关系

来自分类Dev

核心数据-以一对多关系分配值

来自分类Dev

自身实体一对多的快速核心数据关系

来自分类Dev

从一对多关系核心数据中保存,删除和获取数据

来自分类Dev

如何使用一对多关系将数据添加到核心数据?

来自分类Dev

目标C-从核心数据检索一对多关系数据

来自分类Dev

核心数据中同一实体之间的一对多关系

来自分类Dev

如何使用核心数据创建递归一对多关系?

来自分类Dev

核心数据以一对多关系保存在后台

来自分类Dev

核心数据以一对多关系保存在后台

来自分类Dev

iOS:具有一对多关系的核心数据更新对象

来自分类Dev

如何处理核心数据中的一对多关系

来自分类Dev

汇总函数如何在核心数据中的一对多关系上工作

来自分类Dev

Swift核心数据删除一对多关系中的条目

来自分类Dev

核心数据一对多关系导致获取的结果控制器崩溃

来自分类Dev

核心数据:一对多关系-未保存任何详细信息

来自分类Dev

核心数据一对多关系未正确/按预期保存

来自分类Dev

swift核心数据从一对多关系中获取对象

来自分类Dev

核心数据一对多关系,在 NSSet 上分配、获取、谓词

来自分类Dev

在核心数据一对多关系中使同一对象具有多个时间

来自分类Dev

基于一对多关系另一端的属性构造项目的核心数据提取的最佳方法

来自分类Dev

核心数据一对多关系:无法识别的选择器发送到实例

来自分类Dev

如何在 NSArrayController 中为具有一对多关系的核心数据设置“内容集”?

来自分类Dev

核心数据一对多反比关系

Related 相关文章

  1. 1

    核心数据与一对多关系

  2. 2

    核心数据一对多关系

  3. 3

    核心数据不存储数据的一对多关系

  4. 4

    与iOS核心数据的一对多关系

  5. 5

    iOS核心数据一对多关系NSSET

  6. 6

    iOS核心数据一对多关系

  7. 7

    核心数据-以一对多关系分配值

  8. 8

    自身实体一对多的快速核心数据关系

  9. 9

    从一对多关系核心数据中保存,删除和获取数据

  10. 10

    如何使用一对多关系将数据添加到核心数据?

  11. 11

    目标C-从核心数据检索一对多关系数据

  12. 12

    核心数据中同一实体之间的一对多关系

  13. 13

    如何使用核心数据创建递归一对多关系?

  14. 14

    核心数据以一对多关系保存在后台

  15. 15

    核心数据以一对多关系保存在后台

  16. 16

    iOS:具有一对多关系的核心数据更新对象

  17. 17

    如何处理核心数据中的一对多关系

  18. 18

    汇总函数如何在核心数据中的一对多关系上工作

  19. 19

    Swift核心数据删除一对多关系中的条目

  20. 20

    核心数据一对多关系导致获取的结果控制器崩溃

  21. 21

    核心数据:一对多关系-未保存任何详细信息

  22. 22

    核心数据一对多关系未正确/按预期保存

  23. 23

    swift核心数据从一对多关系中获取对象

  24. 24

    核心数据一对多关系,在 NSSet 上分配、获取、谓词

  25. 25

    在核心数据一对多关系中使同一对象具有多个时间

  26. 26

    基于一对多关系另一端的属性构造项目的核心数据提取的最佳方法

  27. 27

    核心数据一对多关系:无法识别的选择器发送到实例

  28. 28

    如何在 NSArrayController 中为具有一对多关系的核心数据设置“内容集”?

  29. 29

    核心数据一对多反比关系

热门标签

归档