设置: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!
还是有更好的方法可以做到这一点?有谁知道如何解决这个问题?
答案 0 :(得分:1)
您的数据设置很荒谬。对于n
个对象的4个属性,您有4个数组。如果由于任何原因导致数组的排序发生变化,或者删除或添加了一个元素,则必须确保所有其他数组都发生同样的事情,这是维护的噩梦!如果以后有15个属性,如何扩展此模型。使用15个阵列?这完全是疯了。
相反,您应该拥有一组对象 - 理想情况下是Core Data对象 - 并将适当的属性组合在一起。您可以随时保留一个标志,表示您希望稍后丢弃这些项目,而不是将它们保留在数据库中。
现在您不必决定创建或更新:只需将删除标记设置为false
即可。
答案 1 :(得分:0)
您需要使用正确的名称搜索现有的Cart对象;如果没有匹配的购物车,则创建一个新购物车。像这样:
omega
关于您的第二个问题,我个人会使用您当前的方法:使用该行作为您的dataSource数组的索引,即不要直接使用来自单元格标签的值等。