根据属性值搜索匹配添加和删除CoreData

时间:2015-10-20 08:56:37

标签: ios swift core-data parse-platform

设置:iOS 9,Swift,XCODE 7.1 Beta

目标是在功能上构建购物车,我需要在CoreData中使用唯一值。

我有一个UITableView,其中从Parse后端上传数据(产品名称,成本,数量,ID)。每个TableView自定义单元格都有一个按钮,点击可以将选定的行数据保存在CoreData中。

我不想在购物车中有重复的产品,所以在保存之前我想检查购物车是否已经有产品。如果有,我想用当前选择的数据替换购物车。如果没有,只想在购物车中添加新产品。

我的CoreData设置很简单。

  

实体名称=购物车

     

Attributes = pName(type String),pCost(type   Int),pQuantity(类型Int),orderID(类型String)

将产品添加到购物车按钮代码如下:

// Product data is retrieved in these variable
var pNam = NSMutableArray()
var pCost = NSMutableArray()
var pQty = NSMutableArray()
var pObjectID = NSMutableArray()

// Add to Cart button ....
    let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0)
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! ProductMenuTableViewCell! // Custom cell in which the button add to Cart button is placed 

        let entityDescription = NSEntityDescription.entityForName("Cart", inManagedObjectContext: managedObjectContext!)
        let cart = Cart(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)

        cart.pName = pNam[indexPath.row].description
        cart.pCost = pCst[indexPath.row].integerValue!
        cart.pQuantity = pQty[indexPath.row].integerValue!
        cart.orderID = pObjectID[indexPath.row].description

        var error: NSError?

        do {
            try managedObjectContext?.save()
        } catch let error1 as NSError {
            error = error1
        }

        if let err = error {
            print(err.localizedFailureReason)
        } else {
            print("Saved")
        }

我应该直接使用单元格向CoreData添加值吗?例如:cart.pName = cell.pName.text!还是有更好的方法可以做到这一点?有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的数据设置很荒谬。对于n个对象的4个属性,您有4个数组。如果由于任何原因导致数组的排序发生变化,或者删除或添加了一个元素,则必须确保所有其他数组都发生同样的事情,这是维护的噩梦!如果以后有15个属性,如何扩展此模型。使用15个阵列?这完全是疯了。

相反,您应该拥有一组对象 - 理想情况下是Core Data对象 - 并将适当的属性组合在一起。您可以随时保留一个标志,表示您希望稍后丢弃这些项目,而不是将它们保留在数据库中。

现在您不必决定创建或更新:只需将删除标记设置为false即可。

答案 1 :(得分:0)

您需要使用正确的名称搜索现有的Cart对象;如果没有匹配的购物车,则创建一个新购物车。像这样:

omega

关于您的第二个问题,我个人会使用您当前的方法:使用该行作为您的dataSource数组的索引,即不要直接使用来自单元格标签的值等。