【问题标题】:CoreData - If something exists don't save it, if it doesn't exists then save itCoreData - 如果存在不保存,如果不存在则保存
【发布时间】:2020-10-04 08:55:24
【问题描述】:

我有一个实体Favourites,它包含诸如idname 之类的值,但问题是它正在创建项目的多个副本,我希望它只存储唯一的值。如何使用 Core Data 做到这一点?

这是我的代码:

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
                
let newFav = Favourites(context: context)

if let id = self.itemsViewModel.items?.results?[indexPath.item].id {
   newFav.id = id
}

if let name = self.itemsViewModel.items?.results?[indexPath.item].name {
   newFav.name = name
}

self.saveItem()

我在警报中执行此操作,并且在该关闭之外是我的 saveItem() 函数,一切正常,但我试图只保存一个具有一个 id 的项目。我正在考虑检查 id 是否存在,但我不太确定如何使用 CoreData 来做到这一点

func saveItem() {
        do {
            let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
            try context.save()
        } catch {
            print("Error saving context \(error)")
        }
    }

【问题讨论】:

  • 这看起来像一个设计问题,为什么你从你的视图模型中获取数据而不是告诉视图模型保存数据?你的数据源是什么,你不是已经获取了现有的收藏夹对象吗?
  • 我的视图模型负责从 api 获取数据。我正在收藏夹数组的另一个视图控制器中获取数据
  • 那么您是从一些外部 Api 下载数据并将其存储在本地吗?是否要更新现有对象?
  • 我从 api 获取数据,项目太多,所以我创建了一个选项来收藏项目并将其存储在核心数据中。这样用户就不必向下滚动很多,只需查看他们收藏的项目。

标签: swift xcode core-data


【解决方案1】:

使用不同的谓词执行提取,如果结果为零,则创建一条新记录,例如

func saveItem(with id : Int32, name : String) {
    do {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let request : NSFetchRequest<Favourites> = Favourites.fetchRequest()
        request.predicate = NSPredicate(format: "id == %d AND name == %@", id, name)
        let numberOfRecords = try context.count(for: request)
        if numberOfRecords == 0 {
            let newFav = Favourites(context: context)
            newFav.name = name
            newFav.id = id
            try context.save()
        }
    } catch {
        print("Error saving context \(error)")
    }
}

【讨论】:

  • 我的收藏夹数据中还有一些东西,一个布尔值来检查它是否是收藏夹和几个字符串值我可以使用这个例子,但我不确定我会用这部分做什么@987654322 @ 没有办法只获取 id 并检查它是否已经存在而不是所有数据类型
  • 如果id 是唯一的,那么只检查id 就足够了:...format: "id == %d", id)
猜你喜欢
  • 2019-08-20
  • 2012-09-06
  • 2014-09-07
  • 2020-08-27
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多