2016-09-16 82 views
3

我在我的项目中使用一般的CoreData查询方法。Swift3:将参数传递到NSFetchRequest方法

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中这是行不通的。我发现这对苹果公司的网站:

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

使用苹果的例子,我怎么会在通过动物的方法作为参数,使findAnimals更通用的?

回答

3

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

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

+0

其实如果我有机会,我张贴后花更多的时间与此:

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)") } } 

与称它为我会意识到这是一直以来的正确答案。 – iphaaw

1

这个怎么样。

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 
} 
+0

已尝试将此函数与func allRecords (表:String,sort:NSSortDescriptor?= nil) - > [T] { return query (table:table,search:nil,sort:sort ) } – iphaaw

+0

等什么?你得到的赏金非常复制我的答案?这有什么意义?大声笑 – Fogmeister

+0

@Fogmeister - 我不得不长时间思考谁得到赏金,因为答案是相似的。我可以将closetCoder的答案复制并粘贴到我的代码中,这就是它的优点。尽管感谢您的帮助。 – iphaaw

0

这里是最后的结果,可以帮助别人:

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()