【问题标题】:Swift3: Passing parameters into NSFetchRequest methodSwift3:将参数传递给 NSFetchRequest 方法
【发布时间】:2016-09-16 07:05:35
【问题描述】:

我在我的项目中使用了通用的 CoreData 查询方法。

func query(table: String, searchPredicate: NSPredicate) -> [AnyObject]
{
    let context = app.managedObjectContext

    let fetchRequest = NSFetchRequest(entityName: table)

    fetchRequest.predicate = searchPredicate

    let results = try! context.fetch(fetchRequest)
    return results
}

在 Swift 3 中这不起作用。我在 Apple 的网站上找到了这个:

func findAnimals() 
{
    let request: NSFetchRequest<Animal> = Animal.fetchRequest
    do 
    {
        let searchResults = try context.fetch(request)
        ... use(searchResults) ...
    } 
    catch 
    {
        print("Error with request: \(error)")
    }
}

使用 Apple 示例,我如何将 Animal 作为参数传递给方法以使 findAnimals 更通用?

【问题讨论】:

    标签: swift3 nsfetchrequest


    【解决方案1】:

    我还没有尝试过,但我认为这样的事情会起作用......

    func findCoreDataObjects<T: NSManagedObject>() -> [T] {
        let request = T.fetchRequest
        do 
        {
            let searchResults = try context.fetch(request)
            ... use(searchResults) ...
        } 
        catch 
        {
            print("Error with request: \(error)")
        }
    }
    

    你必须使整个函数通用,所以你必须在调用它时告诉它 T 是什么类型。

    someObject.findCoreDataObjects<Animal>()
    

    认为应该可以完成这项工作。不完全确定,因为我自己是泛型新手:D

    【讨论】:

    • 实际上,如果我在发布赏金后有机会花更多的时间来处理这个问题,我会意识到这实际上一直都是正确的答案。
    【解决方案2】:

    这个怎么样。

    func query<T: NSManagedObject>(table: String, searchPredicate: NSPredicate) -> [T] {
        let context = app.managedObjectContext
        let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: table)
        fetchRequest.predicate = searchPredicate
        let results = try! context.fetch(fetchRequest)
        return results
    }
    

    【讨论】:

    • 已经尝试过将它与 func allRecords(table: String, sort: NSSortDescriptor? = nil) -> [T] { return query(table: table,搜索:无,排序:排序)}
    • 等等什么?您几乎可以复制我的答案而获得赏金吗?这有什么意义?大声笑
    • @Fogmeister - 我不得不仔细考虑谁得到了赏金,因为答案是相似的。我可以将 closetCoder 的答案复制并粘贴到我的代码中,这就是它的提示。不过感谢您的帮助。
    • 很高兴您发现它有帮助。
    【解决方案3】:

    这是可能对某人有所帮助的最终结果:

    import Foundation
    import Cocoa
    
    func addRecord<T: NSManagedObject>(_ type : T.Type) -> T
    {
        let entityName = T.description()
        let context = app.managedObjectContext
        let entity = NSEntityDescription.entity(forEntityName: entityName, in: context)
        let record = T(entity: entity!, insertInto: context)
        return record
    }
    
    func recordsInTable<T: NSManagedObject>(_ type : T.Type) -> Int
    {
        let recs = allRecords(T.self)
        return recs.count
    }
    
    
    func allRecords<T: NSManagedObject>(_ type : T.Type, sort: NSSortDescriptor? = nil) -> [T]
    {
        let context = app.managedObjectContext
        let request = T.fetchRequest()
        do
        {
            let results = try context.fetch(request)
            return results as! [T]
        }
        catch
        {
            print("Error with request: \(error)")
            return []
        }
    }
    
    func query<T: NSManagedObject>(_ type : T.Type, search: NSPredicate?, sort: NSSortDescriptor? = nil, multiSort: [NSSortDescriptor]? = nil) -> [T]
    {
        let context = app.managedObjectContext
        let request = T.fetchRequest()
        if let predicate = search
        {
            request.predicate = predicate
        }
        if let sortDescriptors = multiSort
        {
            request.sortDescriptors = sortDescriptors
        }
        else if let sortDescriptor = sort
        {
            request.sortDescriptors = [sortDescriptor]
        }
    
        do
        {
            let results = try context.fetch(request)
            return results as! [T]
        }
        catch
        {
            print("Error with request: \(error)")
            return []
        }
    
    }
    
    
    func deleteRecord(_ object: NSManagedObject)
    {
        let context = app.managedObjectContext
        context.delete(object)
    }
    
    func deleteRecords<T: NSManagedObject>(_ type : T.Type, search: NSPredicate? = nil)
    {
        let context = app.managedObjectContext
    
        let results = query(T.self, search: search)
        for record in results
        {
            context.delete(record)
        }
    }
    
    func saveDatabase()
    {
        let context = app.managedObjectContext
    
        do
        {
            try context.save()
        }
        catch
        {
            print("Error saving database: \(error)")
        }
    }
    

    调用它:

    let name = "John Appleseed"
    
    let newContact = addRecord(Contact.self)
    newContact.contactNo = 1
    newContact.contactName = name
    
    let contacts = query(Contact.self, search: NSPredicate(format: "contactName == %@", name))
    for contact in contacts
    {
        print ("Contact name = \(contact.contactName), no = \(contact.contactNo)")
    }
    
    deleteRecords(Contact.self, search: NSPredicate(format: "contactName == %@", name))
    
    recs = recordsInTable(Contact.self)
    print ("Contacts table has \(recs) records")
    
    saveDatabase()
    

    【讨论】:

      【解决方案4】:

      我在我的项目中使用这种方式:

      static func retrieveRecords<T: NSManagedObject>(table: String, sortDescriptorKey: NSSortDescriptor? = nil) -> [T] {
          do {
              let fetchRequest: NSFetchRequest<T> = NSFetchRequest(entityName: table)
              fetchRequest.sortDescriptors = [sortDescriptorKey!]
              let results = try context.fetch(fetchRequest)
              print("\(results)")
              return results
          } catch let error {
              print("Could not fetch \(error.localizedDescription)")
      
              return []
          }
      }
      

      并称它为:

      personen = retrieveRecords(table: "Person", sortDescriptorKey: NSSortDescriptor(key: #keyPath(Person.nachname), ascending: true, selector: #selector(NSString.localizedCompare)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 2017-01-05
        • 2013-10-04
        • 2013-05-19
        • 2013-02-08
        • 2021-07-19
        • 1970-01-01
        相关资源
        最近更新 更多