具有关系实体保存的新实体导致重复错误 - CoreData Swift
New entity with relationship entity saving causes duplication bug - CoreData Swift
我正在尝试创建一个 Entry 对象,并一次性向它添加一个关系对象,但我似乎在执行操作时遇到了错误。
我遇到的问题是当我创建初始 Entry 对象 (1) 并添加一个 Exercise 对象时,它工作正常。然后,当我将第二个 Exercise 对象作为单独的操作添加到 Entry 对象 (1) 时,将创建一个新的 Entry 对象 (2),而不是使用我创建的第一个对象。当我尝试将 third/forth/fifth 练习对象添加到条目对象(按日期区分)时,新练习被添加到第一个条目对象 (1)。不确定我是否正确使用了 NSManagedObjectContext,这最终导致了这个错误。
下面是它的架构。 Entry 对象与 Exercise 对象具有 OneToMany 关系。
- 条目(日期)对象<--->>>练习对象
下面是我在各种文件中使用的代码。
DateModel.swift
class DateModel {
static let sharedInstance = DateModel()
var selectedDate: NSDate! = nil
var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
private init() {
// self.selectedDate = "No date selected"
}
func getEntryForSelectedDate() -> Entry {
let fetchRequest = NSFetchRequest(entityName: "Entry")
fetchRequest.predicate = NSPredicate(format: "date = %@", selectedDate)
var error: NSError?
entries = self.context!.executeFetchRequest(fetchRequest, error: &error) as! [Entry]
var entry: Entry? = nil
if entries.count > 1 {
entry = entries[0] as Entry
} else {
entry = (NSEntityDescription.insertNewObjectForEntityForName("Entry", inManagedObjectContext: self.context!) as? Entry)!
}
return entry!
}
func addExerciseToDay(exercise: String) {
var entryToUpdate = getEntryForSelectedDate()
var newExercise = NSEntityDescription.insertNewObjectForEntityForName("Exercise", inManagedObjectContext: self.context!) as! Exercise
entryToUpdate.date = selectedDate
newExercise.name = exercise
newExercise.createdAt = NSDate()
newExercise.entry = entryToUpdate
entryToUpdate.hasEntry = true
var error: NSError?
if !self.context!.save(&error) {
println("Unresolved error \(error), \(error!.userInfo)")
}
}
}
ExerciseListViewController.swift
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
DateModel.sharedInstance.addExerciseToDay(self.exerciseList[indexPath.row])
self.navigationController?.popViewControllerAnimated(true)
}
我是不是遗漏了什么或者是否有更好的方法使用 Swift 来解决这个问题?
如有任何帮助,我们将不胜感激。
谢谢
if entries.count > 1
仅当存在(至少)两个 个现有对象时才为真。你什么
大概想要的是
if entries.count >= 1
以便 单个 现有对象使用新关系进行更新。
我正在尝试创建一个 Entry 对象,并一次性向它添加一个关系对象,但我似乎在执行操作时遇到了错误。
我遇到的问题是当我创建初始 Entry 对象 (1) 并添加一个 Exercise 对象时,它工作正常。然后,当我将第二个 Exercise 对象作为单独的操作添加到 Entry 对象 (1) 时,将创建一个新的 Entry 对象 (2),而不是使用我创建的第一个对象。当我尝试将 third/forth/fifth 练习对象添加到条目对象(按日期区分)时,新练习被添加到第一个条目对象 (1)。不确定我是否正确使用了 NSManagedObjectContext,这最终导致了这个错误。
下面是它的架构。 Entry 对象与 Exercise 对象具有 OneToMany 关系。
- 条目(日期)对象<--->>>练习对象
下面是我在各种文件中使用的代码。
DateModel.swift
class DateModel {
static let sharedInstance = DateModel()
var selectedDate: NSDate! = nil
var context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
private init() {
// self.selectedDate = "No date selected"
}
func getEntryForSelectedDate() -> Entry {
let fetchRequest = NSFetchRequest(entityName: "Entry")
fetchRequest.predicate = NSPredicate(format: "date = %@", selectedDate)
var error: NSError?
entries = self.context!.executeFetchRequest(fetchRequest, error: &error) as! [Entry]
var entry: Entry? = nil
if entries.count > 1 {
entry = entries[0] as Entry
} else {
entry = (NSEntityDescription.insertNewObjectForEntityForName("Entry", inManagedObjectContext: self.context!) as? Entry)!
}
return entry!
}
func addExerciseToDay(exercise: String) {
var entryToUpdate = getEntryForSelectedDate()
var newExercise = NSEntityDescription.insertNewObjectForEntityForName("Exercise", inManagedObjectContext: self.context!) as! Exercise
entryToUpdate.date = selectedDate
newExercise.name = exercise
newExercise.createdAt = NSDate()
newExercise.entry = entryToUpdate
entryToUpdate.hasEntry = true
var error: NSError?
if !self.context!.save(&error) {
println("Unresolved error \(error), \(error!.userInfo)")
}
}
}
ExerciseListViewController.swift
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
DateModel.sharedInstance.addExerciseToDay(self.exerciseList[indexPath.row])
self.navigationController?.popViewControllerAnimated(true)
}
我是不是遗漏了什么或者是否有更好的方法使用 Swift 来解决这个问题?
如有任何帮助,我们将不胜感激。
谢谢
if entries.count > 1
仅当存在(至少)两个 个现有对象时才为真。你什么 大概想要的是
if entries.count >= 1
以便 单个 现有对象使用新关系进行更新。