2016-09-16 7 views
3

Ich verwende eine allgemeine CoreData-Abfrage-Methode in meinem Projekt.Swift3: Übergeben von Parametern in NSFetchRequest-Methode

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 
} 

In Swift 3 funktioniert das nicht. Ich fand dies auf der Apple-Website:

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

das Apple-Beispiel verwenden, wie würde ich Tier in dem Verfahren als Parameter übergeben findAnimals allgemeineren zu machen?

Antwort

3

Ich habe nicht versucht, aber ich denke, so etwas wie dies funktionieren würde ...

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

Sie haben die ganze Funktion generisch zu machen und so haben Sie es zu sagen, welche Art T wird beim Aufruf .

someObject.findCoreDataObjects<Animal>() 

ich denken, die die Arbeit tun sollten. Nicht ganz sicher, obwohl ich selbst Generika bin: D

+0

Eigentlich, wenn ich Gelegenheit gehabt hatte, damit mehr Zeit zu verbringen, nachdem ich gepostet die Prämie hätte ich erkannt, dass das die ganze Zeit die richtige Antwort war. – iphaaw

1

Wie wäre es damit.

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

Haben wir versucht, dies mit func allRecords zu verwenden (Tabelle: String, Sortierung: NSSortDescriptor? = Nil) -> [T] { Rückfrage (Tabelle: Tabelle, Suche: Null, Sortierung: Sortierung) } – iphaaw

+0

Warte was? Du bekommst das Kopfgeld dafür, dass ich meine Antwort kopiert habe? Wie macht das Sinn? Lol – Fogmeister

+0

@Fogmeister - Ich musste lange darüber nachdenken, wer das Kopfgeld bekam, da die Antworten ähnlich waren. Ich könnte die Antwort von closetCoder in meinen Code kopieren und einfügen. Danke für Ihre Hilfe. – iphaaw

0

Hier ist das Endergebnis, dass jemand helfen kann:

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

Anruf mit:

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