【问题标题】:IOS CoreData fetch duplicates on each view loadIOS CoreData 在每次视图加载时获取重复项
【发布时间】:2020-07-17 13:34:11
【问题描述】:

我是 CoreData 的新手,我在让它工作时遇到了一些困难。

我遇到的问题是每次加载视图控制器时,从核心数据中获取的数据都会重复。

例如:

  • 在名为 Order 的实体中只有 1 个对象
  • 主视图上有两个视图控制器,另一个是订单视图
  1. 第一次 segue 从主视图推送到订单视图,订单视图显示 1 个订单(普通)
  2. 从订单视图返回到主视图
  3. 第二次segue从主视图推送到订单视图,订单视图 显示 2 个订单(重复)
  4. 再次,从订单视图返回到主视图
  5. 第三次进入订单视图,订单视图显示4个订单(下次 将是 8 个等等)
  6. 退出应用,重新输入,返回1个订单

不知道为什么每次调用 fetch 方法都会返回重复的对象

订单视图控制器

var dataSource = [FailedOrderEntity](){
        didSet {
            tableView.reloadData()
        }
}

override func viewDidLoad(){
        super.viewDidLoad()
        tableView.dataSource=self
        tableView.delegate=self
        fetchFailedOrders()
}

func fetchFailedOrders(){
        dataSource.removeAll()
        dataSource = failedOrderCoreData.fetchAll()
}

//Other are all table related

FailedOrderCoreData

class FailedOrderCoreData {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    var context = NSManagedObjectContext()
    let entityName = "FailedOrderEntity"

    init() {
        context = appDelegate.persistentContainer.viewContext
    }

    func fetchAll() -> [FailedOrderEntity] {
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        var fetched: [FailedOrderEntity] = []
        do {
            let results = try context.fetch(request)
            if !results.isEmpty {
                for result in results as! [NSManagedObject] {
                    //breakpoint: 1st time call result returns 1, 2nd returns 2, 3rd returns 4, 4th returns 8..so on
                    let order = FailedOrderEntity(context: context)
                    order.order_id = result.value(forKey: "order_id") as? Int32 ?? 0
                    fetched.append(order)
                }
            }
        } catch {
            print("ERROR: Could not fetch orders")
        }
        return fetched
    }
}

感谢您的帮助

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    这是因为您使用此代码在循环中创建了新数据

    let order = FailedOrderEntity(context: context)
    

    要使用实体类模型获取数据,请使用此代码

    var fetched: [FailedOrderEntity] = []
    let fetchRequest: NSFetchRequest<FailedOrderEntity> = FailedOrderEntity.fetchRequest()
    do{
        try fetched = context.fetch(fetchRequest)
    } catch {}
    

    【讨论】:

    • 谢谢伙计。事实证明,我不需要所有这些语句来获取。这要容易得多。
    • 是的,我不知道为什么大多数教程没有使用这种最简单的方法来获取数据
    猜你喜欢
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2015-12-21
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多