0

Ok, ich suchte und versuchte in diesem Fall für die letzten 1-2 Wochen und ich habe es nicht funktionieren. Ich würde erreichen können, was ich ohne NSFRC erreichen möchte, aber aus Leistungsgründen und Bequemlichkeit möchte ich es mit der NSFRC machen. So habe ich ein Datenmodell mit 2 Einheiten - to-many RelationshipNSFetchedResultsController und to-many Beziehung funktioniert nicht

Es das Bild sieht, ist ein Konto und ein Konto kann vielen accountchanges hat - was ganz offensichtlich. Also ich möchte in der Lage sein, einen Account zu wählen und dann alle AccountChanges für diesen bestimmten Account zu zeigen. Bisher war es mir möglich, den Account zu bekommen und auch auf den NSSet in der cellForRow-Funktion zuzugreifen, aber ich bekomme nicht die richtigen Sektionen und numberOfRowsInSection - das ist das Hauptproblem. Hier

ist ein Code:

func numberOfSections(in tableView: UITableView) -> Int { 

    print("Sections : \(self.fetchedResultsController.sections?.count)") 
    if (self.fetchedResultsController.sections?.count)! <= 0 { 
     print("There are no objects in the core data - do something else !!!") 
    } 
    return self.fetchedResultsController.sections?.count ?? 0 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print("Section Name") 
    print(self.fetchedResultsController.sections![section].name) 
    let sectionInfo = self.fetchedResultsController.sections![section] 
    print("Section: \(sectionInfo) - Sections Objects: \(sectionInfo.numberOfObjects)") 
    return sectionInfo.numberOfObjects 
} 

Es gibt einige Druckanweisungen, die nur zur Information!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let myCell = myTable.dequeueReusableCell(withIdentifier: "myCell")! as UITableViewCell 
    let accountBalanceChanges = self.fetchedResultsController.object(at: indexPath) 
    print("AccountBalanceChanges from cell....") 
    print(accountBalanceChanges) 

    let details = accountBalanceChanges.accountchanges! as NSSet 
    print("Print out the details:") 
    print(details) 
    let detailSet = details.allObjects 
    let detailSetItem = detailSet.count // Just for information! 


    let myPrint = detailSet[indexPath.row] as! AccountChanges 
    let myVal = myPrint.category 

    myCell.textLabel?.text = myVal 

    return myCell 
} 

Also, ich bin in der Lage, die Daten zu bekommen, aber immer nur ein Element und nicht das ganze Set - ich denke, aufgrund der Tatsache, dass die Abschnitte/numberOfRows falsch ist.

Hier ist meine NSFRC

var fetchedResultsController: NSFetchedResultsController<Accounts> { 
    if _fetchedResultsController != nil { 
     return _fetchedResultsController! 
    } 
    let fetchRequest: NSFetchRequest<Accounts> = Accounts.fetchRequest() 
    // Set the batch size to a suitable number. 
    fetchRequest.fetchBatchSize = 20 
    // Edit the sort key as appropriate. 

    let sortDescriptor = NSSortDescriptor(key: "aName", ascending: false) 
    fetchRequest.sortDescriptors = [sortDescriptor] 


    let predicate = NSPredicate(format: "(ANY accountchanges.accounts = %@)", newAccount!) 
    fetchRequest.predicate = predicate 
    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.coreDataStack.context, sectionNameKeyPath: nil, cacheName: nil) 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    do { 
     try _fetchedResultsController!.performFetch() 
    } catch { 
     // Replace this implementation with code to handle the error appropriately. 
     // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     let nserror = error as NSError 
     fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 

    return _fetchedResultsController! 
} 

Ich gehe davon aus es die SortDescriptor oder das Prädikat - oder vielleicht beides?

Irgendwelche Hilfe oder mindestens Richtungen werden gut geschätzt. Ich habe schon viele verschiedene Ansätze ausprobiert, aber keine gab mir die richtigen Ergebnisse.

+0

Ein weiterer Kommentar, ich viele verschiedene Wege in SortDescriptor und im Prädikat/oder der sectionNameKeyPath von NSFRC versucht - die meisten Fehlermeldung sind: „zu viele Schlüssel ist hier nicht erlaubt“ oder "keypath for (category, title ...) existiert nicht" Von obigem Code scheint das Prädikat zu funktionieren, aber der SortDescriptor gibt mir die meisten Probleme ... mein Tipp –

Antwort

1

würde ich das Gegenteil tun, ich meine mit dem FRC alle Änderungen für ein Konto mit einem bestimmten Id zu holen, und verwenden Sie das folgende Prädikat:

let predicate = NSPredicate(format: "accounts.aId = %@", ACCOUNTID) 

oder

let predicate = NSPredicate(format: "accounts = %@", account.objectID) 

I würde die Accountstität in Konto umbenennen und für die Beziehung dasselbe, da es sich um eine direkte Beziehung handelt. Das geht davon aus, dass Sie eine Tabellenansicht mit allen Konten haben und wenn Sie auf eine klicken, erhalten Sie ihre Änderungen zurück.

var fetchedResultsController: NSFetchedResultsController<AccountChanges> { 
    if _fetchedResultsController != nil { 
     return _fetchedResultsController! 
    } 
    let fetchRequest: NSFetchRequest<AccountChanges> = AccountChanges.fetchRequest() 
    // Set the batch size to a suitable number. 
    fetchRequest.fetchBatchSize = 20 
    // Edit the sort key as appropriate. 

    let sortDescriptor = NSSortDescriptor(key: "aName", ascending: false) 
    fetchRequest.sortDescriptors = [sortDescriptor] 


    let predicate = NSPredicate(format: "accounts.aId = %@", ACCOUNTID) 
    fetchRequest.predicate = predicate 
    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.coreDataStack.context, sectionNameKeyPath: nil, cacheName: nil) 
    aFetchedResultsController.delegate = self 
    _fetchedResultsController = aFetchedResultsController 

    do { 
     try _fetchedResultsController!.performFetch() 
    } catch { 
     // Replace this implementation with code to handle the error appropriately. 
     // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     let nserror = error as NSError 
     fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
    } 

    return _fetchedResultsController! 
} 

Prost

+0

Ich dachte auch darüber nach, aber dann bin ich wirklich nicht mehr Ich brauche keine Beziehungen, da ich die accountID einfach an jede Kontoänderung weitergeben kann. Aber da wir die Möglichkeit haben, Beziehungen zu nutzen, wollte ich es so machen. Wie auch immer, wenn es keine andere Lösung gibt, könnte ich es so machen und umgestalten. Ich habe bereits eine eindeutige ID in beiden meiner Datenbank und ich kann es auf diese Weise tun, aber wieder wäre es schön, es mit Beziehung und NSFRC arbeiten zu lassen. Danke für Ihren Vorschlag ... –

+0

Mein Vorschlag noch immer Beziehungen und NSFRC. Sie müssen nur andersherum holen.Anstatt die Konten abzurufen und auf die Änderungen zuzugreifen, rufen Sie alle Änderungen für das Konto mit der ID ab, die Sie für das Prädikat übergeben haben. – ubiAle

+0

Das funktioniert nicht, es ist nur ein Eins-zu-eins-Wechsel von Konten zu Konten - dies kann nicht geändert werden, da eine Kontoänderung nur ein Konto betreffen kann. Es gibt nur eine Eins-zu-viele von Konten zu Kontoänderungen - siehe das Bild. Und wie ich oben schrieb, ist das Prädikat nicht das Problem, es ist der SortDescriptor oder der keyPath in NSFRC. Ich bekomme den richtigen account, aber die Anzahl der Änderungen ist falsch in sections/numberOfRows .... Und wie gesagt, ich kann das alles ohne NSFRC tun - so ist das Problem nicht das Holen selbst, es ist das Holen mit NSFRC weil du ein NSSet von der rel zurückbekommst. –

Verwandte Themen