从 tableView 上的核心数据填充数据时如何避免行重复

Posted

技术标签:

【中文标题】从 tableView 上的核心数据填充数据时如何避免行重复【英文标题】:How avoid duplication of rows when populating data from core data on a tableView 【发布时间】:2016-10-31 09:01:34 【问题描述】:

我正在开发一个用 swift 3.0 编写的项目。我的要求是在保存在 CoreData 上的表格视图上检索和填充数据,我在某些文本字段中输入,因此一旦选择了一行,我想更新该记录(在我的文本字段上重新分配值并保存) . 基本上我有一个名为“UserIncome”的实体,它的属性很少。因此,当我想编辑我输入的数据时,我点击一行,它会将我引导到我最初输入这些数据的 ViewController。但是,当我单击添加按钮并保存数据时,我会得到重复的数据,并且它们会填充到我的表格视图中。我怎么能阻止这个。我保存数据的类的代码如下。

import UIKit
import CoreData

class AddIncomeViewController:UIViewController,UITableViewDelegate,UITableViewDataSource 

@IBOutlet weak var toDateView: UIView!
@IBOutlet weak var setDateFromView: UIView!
@IBOutlet weak var datePickerTo: UIDatePicker!
@IBOutlet weak var datePickerFrom: UIDatePicker!
@IBOutlet weak var dropDowntableView: UITableView!
@IBOutlet weak var fromTextField: UITextField!
@IBOutlet weak var toTextField: UITextField!
@IBOutlet weak var amountTextField: UITextField!

@IBOutlet weak var incomeTypeLabel: UILabel!
@IBOutlet weak var incomeNameTextField: UITextField!

var myArray = ["Recurring Income", "Other Income"]

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var store : UserIncome?
var otherInc : UserIncome?

override func viewDidLoad() 
super.viewDidLoad()

 if let s = store 
    incomeNameTextField.text = s.incomeName
    amountTextField.text = s.amount
    fromTextField.text = s.fromDate
    toTextField.text = s.toDate
    incomeTypeLabel.text = s.incomeType

 
 if let o = otherInc 
    incomeNameTextField.text = o.incomeName
    amountTextField.text = o.amount
    fromTextField.text = o.fromDate
    toTextField.text = o.toDate
    incomeTypeLabel.text = o.incomeType


  


 


 @IBAction func cancelButtonPressed(_ sender: AnyObject) 
 navigationController!.popViewController(animated: true)

 


 @IBAction func addButtonPressed(_ sender: AnyObject) 

 if store == nil

  let storeDesciption = NSEntityDescription.entity(forEntityName: "UserIncome", in: context)

    store = UserIncome(entity:storeDesciption! , insertInto: context)
    //otherInc = UserIncome(entity:storeDesciption! , insertInto: context)

 
 if otherInc == nil
    let storeDesciption = NSEntityDescription.entity(forEntityName: "UserIncome", in: context)

    otherInc = UserIncome(entity:storeDesciption! , insertInto: context)


 


store?.incomeName = incomeNameTextField.text
store?.amount = amountTextField.text
store?.fromDate = fromTextField.text
store?.toDate = toTextField.text
store?.incomeType = incomeTypeLabel.text

otherInc?.incomeName = incomeNameTextField.text
otherInc?.amount = amountTextField.text
otherInc?.fromDate = fromTextField.text
otherInc?.toDate = toTextField.text
otherInc?.incomeType = incomeTypeLabel.text

var error : NSError?

(UIApplication.shared.delegate as! AppDelegate).saveContext()
 if let err = error

    let a = UIAlertView(title: "Success", message: err.localizedFailureReason, delegate: nil, cancelButtonTitle: "OK")
    a.show()
 else 
    let a =  UIAlertView(title: "Success", message: "Successfully saved", delegate: nil, cancelButtonTitle: "OK")
    a.show()
    //  navigationController!.popViewController(animated: true)
 

【问题讨论】:

不清楚你在问什么。您的意思是防止重复的用户输入或现有数据的重复表格单元格? 不,先生,基本上当我单击添加按钮时,数据会两次添加到我的 tableView 中。我认为问题出在 addButtonPressed 方法上。 您正在创建一个UserIncome 对象两次。为什么? 因为在我检索数据的 viewController 中有两个不同的 tableViews。因此,如果在该 VC 中选择了特定行,则会触发 segue 并将数据传递给上面的类。这两个表视图有两个不同的数据集 核心数据对象应该被共享。那是你的问题。你是如何填充你的表视图的?你应该使用NSFetchedResultsController 【参考方案1】:

您添加了两个不同的UserIncome 对象。您应该添加一个,并将其共享给您的表格视图。

【讨论】:

以上是关于从 tableView 上的核心数据填充数据时如何避免行重复的主要内容,如果未能解决你的问题,请参考以下文章

如何让 tableView.reloadData() 与核心数据正常工作?

使用核心数据和数组从 TableView 中插入和删除行

如何使用来自 Alamofire 的 JSON 数据填充 tableview?

如何从数据源填充 TableView 单元格?我目前收到错误

如何使用 json 而不是 plist 来填充 TableView

从 iphone 的核心数据中删除对象时应用程序崩溃