' NSInvalidArgumentException',原因:' to-many key不允许在这里'

时间:2017-02-25 11:12:48

标签: ios core-data swift3

我已经看到了一些可以解决我问题的方法。

我创建了两个实体,Shop和Article。商店有关系"文章"和文章" shop",两者都是多对多和有序的关系。

enter image description here

对于商店我有一个CollectionViewController和文章TableViewController。选择一个商店后,我通过segue将其发送到ArticleTableViewController,在那里我可以将文章添加到当前商店。

ArticleTableViewController

var articles: [Article] = []
var currentShop: Shop?

@IBAction func pressAddButton(_ sender: UIButton) {
    let article = Article(context: managedContext!)
    article.name = "Milk"

    currentShop?.addToArticles(article)

    saveManagedContext()
    tableView.reloadData()
}

 func loadArticles () {

    let articleFetchRequest: NSFetchRequest<Article> = Article.fetchRequest()
    articleFetchRequest.predicate = NSPredicate(format: "shop = %@", currentShop!)

    do {
        articles = try managedContext.fetch(articleFetchRequest)

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

func saveManagedContext() {
    do {
        try managedContext?.save()
    } catch let error as NSError {
        print("Could not save \(error), \(error.userInfo)")
    }
}

如果我构建并运行并选择一个商店,应用终止的原因是: &#39; NSInvalidArgumentException&#39;,原因:&#39;这里不允许使用多对键&#39;

我认为问题是谓词,因为如果我将其评论并再次运行然后选择商店它可以正常工作,但所有商店都有我添加的相同文章。

如何仅提取所选商店的文章?

1 个答案:

答案 0 :(得分:3)

尝试

 NSPredicate(format: "ANY shop = %@", currentShop!)

或者,您可以只使用currentShop.articles吗?这将返回Set,在这种情况下可能不适合您的目的,但是...通常您可以关注关系。