【问题标题】:Core Data generic fetch request [duplicate]核心数据通用获取请求[重复]
【发布时间】:2018-10-30 04:44:52
【问题描述】:

我使用以下代码从核心数据实体一中获取数据:

func fetchDataOne() {
let fetchRequest: NSFetchRequest<One> = One.fetchRequest()
    do {
        fetchRequest.predicate = NSPredicate(format: "questionWasShown == %@", NSNumber(value: false))
        // Save result to result array
        let result = try PersistentService.context.fetch(fetchRequest)

        if result.count > 0 {
             // do some stuff
            }
  }

我计划添加更多实体 (20-30)。很难维护 30 个不同的 fetch 请求。我想重写这一行

let fetchRequest: NSFetchRequest<One> = One.fetchRequest() 

这样我就可以使用通用代码。我想实现这样的目标

func fetchData(entity: T) {
 ...
 let fetchRequest: NSFetchRequest<T> = T.fetchRequest()
 ...
 }

Core Data 有可能吗?

【问题讨论】:

  • 是的。你需要的是让编译器知道TfetchRequest()
  • 冷酷无情,请提供示例代码?
  • 最简单的方法是使用protocol。创建一个具有fetchRequest() 函数的协议,并将该协议用作fetchData(entity: #protocol) 中的参数。

标签: swift core-data


【解决方案1】:

正如 Ryan 上面在 cmets 中所说的,你必须让编译器知道 T 有方法 fetchRequest,像这样:

func fetchData<T:NSManagedObject>(entity: T.Type) {
    let fetchRequest = T.fetchRequest()
    do {
        fetchRequest.predicate = NSPredicate(format: "questionWasShown == %@", NSNumber(value: false))
        let result = try CoreDataHelper.managedObjectContext.fetch(fetchRequest)
        if result.count > 0 {
            // do some stuff
        }
    } catch {

    }
}

用法:

self.fetchData(entity: One.self)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2019-11-06
    • 2013-04-02
    • 1970-01-01
    相关资源
    最近更新 更多