【发布时间】:2016-05-24 04:25:03
【问题描述】:
我一直在寻找如何处理一对多关系的问题。 但我想不通。
我正在开发一个存储学科成绩的应用程序。所以一门学科与成绩有一对多的关系。当前所有数据都存储在一个数组中。
var vakken: [(naam:String, voorkeurGemiddelde:Double, wegingGemiddelde:Double, cijfer:[Double], weging:[Double], gemiddelde:Double)] = []
[Double]'s - 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 中的数据。
我在一些教程中看到使用: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,我如何引用属性,尤其是成绩。
我还按名称对数组进行排序,可以是 A-Z 或 Z-A,我按平均值排序,可以是 10-1 或 1-10。我有代码可以在我的数组中对其进行排序。
4。但我不知道如何用核心数据对其进行排序。
我还看过一个教程,他们为link 属性创建了一个类。 所以我自己做了一个:
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) 保存到上下文中?
像这样:vak.gemiddelde = newgemiddelde
【问题讨论】:
-
我不认为您打算使用 AppDelegate(),因为它会初始化您的 AppDelegate 的新实例,而是我认为您的意思是“让 appDelegate = UIApplication.sharedApplication().delegate 为! AppDelegate',因为这将获取应用程序 AppDelegate 的当前实例。
-
Appdelegate() 是一个返回 appdelegate 的函数。所以不用担心。
标签: swift core-data relationship one-to-many