Abgerufene Eigenschaften - Prädikat

Ich habe eine Frage zur Verwendung von abgerufenen Eigenschaften in einem NSPredicate (siehe unten "Meine Frage"). Es geht nicht um das Prädikat, um die abgerufene Eigenschaft zu erhalten. Zur Verdeutlichung und für andere, die ebenfalls mit diesem Problem konfrontiert sind, habe ich versucht, ein kleines Beispielprojekt zu erstellen.

PROBENPROJEKT

Die Notwendigkeit, abgerufene Eigenschaften zu verwenden, ergab sich, weil meine App aufgrund eines Verstoßes gegen die iOS-Richtlinien zur Datenspeicherung abgelehnt wurde. ImQA1719 Sie schreiben:

Apps sollten vermeiden, App-Daten und Benutzerdaten in derselben Datei zu mischen.

Ich denke, dies kann für eine einfachere ICloud-Synchronisierung erforderlich sein und auch bei der Migration hilfreich sein.

Also, wie mache ich das?

Ich hatte eine vorinstallierte SQLite-Datenbank verwendet, die ich beim ersten Start aus dem Bundle-Pfad kopiert und zum Speichern von Benutzeränderungen verwendet habe. Da Sie vorinstallierte und Benutzerdaten nicht mischen sollten, versuche ich, sie zu trennen.

Das Hauptproblem ist, dass es nicht möglich ist, Beziehungen zwischen verschiedenen Geschäften zu haben (Geschäftsübergreifende Beziehungen).

Ich habe noch kein Muster für ein Projekt für abgerufene Immobilien gefunden, also versuche ich hier, mein eigenes zu machen.

Für die Probe gibt es:

eine vorinstallierte Liste von Büchern (in dem Beispiel laden Sie sie mit dem Plus-Symbol vor), die im permanenten Speicher Books.sqlite und gespeichert isteine Möglichkeit, Bücher zu Ihren Lieblingsbüchern zu machen. Dies wird im persistenten Speicher UserData.sqlite gespeichert.

Die Entitäten sind:

--------------                --------------
|   Books    |                |   Favorite |
--------------                --------------
- author                      - favorite
- title        --- 1 : 1 ---  - books_title

Entity 'Books' ist für PreloadedData, 'Favorite' sollte UserData enthalten.

Das Favorite-Tag ist nur ein Beispiel, es kann sich auch um vom Benutzer erstellte Notizen (Prädikat für Notiz verfügbar) handeln oder wenn das Buch an eine andere Person vermietet wird ...

In meinem xcdatamodeld (Xcode Editor) habe ich zwei Konfigurationen hinzugefügt (PreloadStore, UserStore). Jedes enthält nur die benötigte Entität.

Sie werden verwendet mit (alles andere ist von Boilerplate):

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"PreloadStore" URL:storeURL options:nil error:&error]) {
...
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"UserStore" URL:storeURLUserData options:nil error:&error]) {

Ich habe eine abgerufene Eigenschaft link_favorite in Books with the Predicate erstellt

books_title == $FETCH_SOURCE.title

Das Beispielprojekt kann seinheruntergeladenHier. Es funktioniert, bis auf das Prädikat (Filter nach Lieblingsbüchern).

MEINE FRAGE

Ich möchte meinen Abruf in Büchern nur nach den Büchern filtern, die meine Favoriten sind. Ich habe versucht mit

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"favorite_link.favorite == 1"];

imMasterViewController.m (fetchedResultsController), dies führt jedoch nur zu einem Absturz.

Ich denke, ich muss etwas benutzenwie hier mit einem COUNT oder einer SUBQUERY, aber ich konnte es nicht herausfinden.

Vielen Dank im Voraus für Ihre Hilfe!

--bearbeiten:

Ich habe einen einfachen NSArray-Abruf (Core Data) durchgeführt, hier funktioniert Folgendes:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY link_favorite.favorite == 1"];
result = [result filteredArrayUsingPredicate:predicate];

Aber wie übersetze ich das in eine SUBQUERY für den NSFetchedResultsController (habe diesen Blogartikel ausprobiert)? Falsch ist:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(contents, $x, $x.link_favorite.favorite == 1).@count > 0"]

Antworten auf die Frage(2)

Ihre Antwort auf die Frage