ios - 具有关系实体保存的新实体导致重复错误 - CoreData Swift

标签 ios swift core-data nsmanagedobjectcontext

我正在尝试创建一个 Entry 对象,并一次向它添加一个关系对象,但我似乎遇到了一个与后续操作有关的错误。

我遇到的问题是当我创建初始 Entry 对象 (1) 并添加一个 Exercise 对象时,它工作正常。然后,当我将第二个 Exercise 对象作为单独的操作添加到 Entry 对象 (1) 时,将创建一个新的 Entry 对象 (2),而不是使用我创建的第一个对象。当我尝试将第三个/第四个/第五个练习对象添加到条目对象(按日期区分)时,新练习被添加到第一个条目对象(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

以便用新关系更新单个现有对象。

关于ios - 具有关系实体保存的新实体导致重复错误 - CoreData Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31240948/

相关文章:

ios - 无法加载名为 "Project name"的模型

objective-c - 为什么苹果使用 NSOrderedSet 而不是 NSArray 来处理 CoreData 中的有序多值关系?

ios - 按 NSExpressionDescription 中的表达式排序

ios - 使用 "po"从控制台日志中的服务器响应中获取数据

swift - UISearchBar 和 Firebase 数据库

json - 快速登录应用程序后,主视图 Controller 没有响应

iphone - 使用搜索栏时,表格仅显示 2 个标签(共 4 个)

objective-c - XCode 4 iOS - 调试器显示字节码而不是告诉我应用程序崩溃的那一行

ios - 当我在 swift 4 中向下和向上滚动时,最喜欢的按钮会发生变化

ios - 从应用委托(delegate)中检索 managedObjectContext 时崩溃