核心数据,关系-将多个选定行存储到实体

时间:2018-07-09 10:48:17

标签: ios swift core-data relationship

我需要帮助-我想通过关系将tableView中的多个选定行存储到一个实体中

让我说: CoreData模型: 实体_1 =包 Entity_2 =物品

用户可以创建“小孔系列手提袋”和“物品”,然后将其放入“选择袋”中。因此,如果该家庭度假,则每个家庭成员都有自己的手提袋,其中装有一些物品。在每个“包”中(如果用户选择了它们)。

Bags (for):
- Carol 
- Bens 
- Eva

Items:
- toothbrush
- towel
- shoes
- hairbrush
- makeup

->我知道仅将一个项目存储到每个实体(通过关系)的方法。但是我需要帮助才能一次将多个项目存储在选定的“包”中

Ben只想拿起:牙刷和毛巾 Carol拿走了所有5个物品 Eva选择牙刷,化妆品和鞋子

如果我打开tableViewController,则会列出所有项目: 我必须将所有选定的项存储到一个数组中,然后将该数组存储到coredata中。谁可以给我一段代码?谢谢您的帮助。

FetchesResultsController:

    lazy var fetchedResultsCtrl: NSFetchedResultsController<Item> = {
        let request: NSFetchRequest<Item> = Item.fetchRequest()
        let sort = NSSortDescriptor(key: "itemName", ascending: true)
        //let catSort = NSSortDescriptor(key: "kategorie", ascending: true)
        request.sortDescriptors = [sort]
        let fetchedCtrl = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.managedContext, sectionNameKeyPath: nil, cacheName: nil)
        // an UserDefaults binden o.ä.:
        //NSFetchedResultsController.deleteCache(withName: "kategorieCache")

        fetchedCtrl.delegate = self
        return fetchedCtrl
    }()

TableView:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! detailsInterieur
        let items = fetchedResultsCtrl.object(at: indexPath)
        cell.nameLabel?.text = items.itemName

        if let paths = tableView.indexPathsForSelectedRows {
            if (paths.contains(indexPath)){
                cell.accessoryType = .checkmark
            }
            else {
                cell.accessoryType = .none
            }
        }
        else{
            cell.accessoryType = .none
        }
        cell.selectionStyle = .none

        return cell
    }


override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         print("select")
}


override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
         print("deselect")
}

编辑: 我可以通过以下代码找到选择:

guard let selectedRows = tableView.indexPathsForSelectedRows else {
            return
        }

此功能是自动生成的。但是我该如何正确使用它们呢?

@objc(addBag_RELObject:)
@NSManaged public func addToBag_REL(_ value: MyBag)

@objc(removeBag_RELObject:)
@NSManaged public func removeFromBag_REL(_ value: MyBag)

@objc(addBag_REL:)
@NSManaged public func addToBag_REL(_ values: NSSet)

@objc(removeBag_REL:)
@NSManaged public func removeFromBag_REL(_ values: NSSet)


@objc(addItem_RELObject:)
@NSManaged public func addToItem_REL(_ value: Item)

@objc(removeItem_RELObject:)
@NSManaged public func removeFromItem_REL(_ value: Item)

@objc(addItem_REL:)
@NSManaged public func addToItem_REL(_ values: NSSet)

@objc(removeitem_REL:)
@NSManaged public func removeFromitem_REL(_ values: NSSet)

2 个答案:

答案 0 :(得分:3)

根据您的情况,实体上的项目应为个关系。在这种情况下,您的 Bag NSMangedObject类或其扩展名(取决于您在 codegen 中选择的内容)应该已生成方法@NSManaged public func addToItems(_ values: NSSet)。 您可以从 tableView的变量 indexPathsForSelectedRows中获取选定的项目,生成 Items 并通过调用addToItems(:)将它们添加到您的 bag 对象中

但是更好的方法是明智地使用 CoreData 。在您的情况下,物品将具有bag属性(根据关系),因此当您创建物品并为其分配有效的袋子< / strong>对象,它将自动更新关系的另一端。

答案 1 :(得分:2)

假设您已经在selectedRow中选择了项目,并且您当前选择的购物袋具有某些属性,请说selectedBag,然后

guard let selectedRows = tableView.indexPathsForSelectedRows else {
    return
} 

for path in selectedRows {
    let item = fetchedResultsCtrl.object(at: path.row)
    selectedBag.addToItem_REL(item)
}

然后在托管对象上下文中调用save()