Czy ktoś ma przykład, w jaki sposób modelować i kodują przemijający do jednej relacji w CoreData? Na przykład mam 2 podmioty o relacji jeden-do-wielu. Lekarz i spotkanie. Teraz chcę przejściową relację o nazwie MostRecentAppointment w jednostce lekarza. Modelowanie w kodzie źródłowym jest proste, ale nie jestem pewien co do strony implementacji. Czy powinienem również wprowadzić odwrotność? Wydaje się głupie.CoreData przejściowy związek przykładem
Odpowiedz
Należy dodać jednostkę typu Spotkanie o nazwie newApoint i ustawić ją przy każdym tworzeniu nowej wizyty u danego lekarza. To takie proste.
Zawsze stosuj odwrotność jak jabłko, zalecamy to do sprawdzania poprawności i wydajności danych podstawowych.
Można również oznaczyć godzinę terminów i użyć NSPredicates do wyszukania ostatniego spotkania w połączonych spotkaniach lekarza.
Co ze wsparciem KVO? Raczej korzystam z platformy CoreData, tak jak robią to zwykłe właściwości przejściowe. – batkuip
Jest to prawdą, ale w większości przypadków trzeba by połączyć faktyczne spotkania z lekarzem i odwrotnie przy tworzeniu, więc nadal potrzebowałbyś lekarza przy tworzeniu. Biorąc pod uwagę, że jest to ostatnia wizyta. Chociaż zgadzam się, że KVO jest dobrym podejściem, w tym przypadku może być przesadą. – Dev2rights
Ofc to jest przykład. Moja aplikacja jest nieco bardziej złożona. Więc KVO jest przydatny. Ponieważ relacje nie są zapisywane (przejściowe), w jaki sposób przywracasz linki po uruchomieniu aplikacji? – batkuip
spojrzeć na ten kod pisałem niedawno, buforować obrazu w NSManagedObject:
Najpierw trzeba zdefiniować przemijające własność w modelu (Zauważ, że jeśli przejściowe punkty własności do typu obiektu innego niż te obsługiwane przez CoreData zostawisz jako „Undefined
” w modelu)
Następnie należy ponownie wygenerować podklasę NSManagedObject dla tego podmiotu lub po prostu dodać nową właściwość ręcznie, nagłówek plik powinien wyglądać tak:
@interface Card : NSManagedObject
@property (nonatomic, retain) NSString * imagePath;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSNumber * order;
@property (nonatomic, retain) NSString * displayName;
@property (nonatomic, retain) UIImage *displayImage;
@end
Tutaj możemy zmienić klasę własności przejściowej do rzeczywistej klasy typu
np displayImage
wpisz tutaj: UIImage
.
W pliku wdrożeniowego (lub klasy przedłużenie) wdrożyć getter/setter dla przemijającego nieruchomości:
-(UIImage*)displayImage{
//Get Value
[self willAccessValueForKey:@"displayImage"];
UIImage *img = (UIImage*)[self primitiveValueForKey:@"displayImage"];
[self didAccessValueForKey:@"displayImage"];
if (img == nil) {
if ([self imagePath]) { //That is a non-transient property on the object
img = [UIImage imageWithContentsOfFile:self.imagePath];
//Set Value
[self setPrimitiveValue:img forKey:@"displayImage"];
}
}
return img;
}
nadzieję, że pomaga.
Wiem, jak to zrobić i jest to trochę bardziej zaangażowane niż to, na co masz ochotę, ponieważ musisz uporać się z unieważnianiem pamięci podręcznej i błędami. Niezależnie od tego moje pytanie dotyczyło właściwości przejściowych relacji NIE. Istnieje niewiele informacji na temat przejściowych relacji. Stąd ja zamieszczam to pytanie. Na przykład, jak radzić sobie z unieważnieniem pamięci podręcznej, gdy rzeczy są dodawane lub usuwane do zwykłej relacji jeden-do-wielu (dodając normalne spotkanie). – batkuip
Cóż, po prostu trzeba wypróbować w swoim własnym programie przykładowym, który może być ustawiony nie więcej niż na godzinę.
Przypuszczam, że nie będzie potrzebne żadne dodatkowe kodowanie. Jeśli dokumentacja Apple na CoreData jest poprawna, jedyną różnicą między normalnym atrybutem/relacją a "przejściowym" jest to, że ta ostatnia nie jest zachowana, co oznacza, że kiedy "zapiszesz", to nie aktualizuje magazynu trwałego.
Przypuszczam, że w przeciwnym razie wszystkie jego aspekty są kompletne, wraz ze zgodnością z KVO/KVC, obsługą cofania, sprawdzaniem poprawności i automatyczną aktualizacją według zasad usuwania. Jedyną rzeczą jest to, że po świeżym Przyniesieniu istoty --- związek przejściowy będzie zawsze zerowy.
Dla tego --- NIE poleciłabym ustawić relacji przejściowej jako "nieobowiązkowej", ponieważ jest bardzo prawdopodobne, że w większości przypadków jest ona zerowa.
Ustanowię odwrotną relację (również przemijającą i mądrze nazwaną) i obie zasady usuwania będą "Nullify".
Do tej pory chodzi o związek przejściowy.
Ale oto alternatywa, którą wymyśliłem, próbując rozwiązać prawie ten sam problem. Moje "spotkanie" jest jednym z powiązanych spotkań, ale nie tylko "ostatnim", ale pierwszym "niedokończonym". Bardzo podobna logika.
Zamiast przejściowy związek, dodałem nową właściwość obliczonych na moich „Doktor” entitys generowanych NSManagedObject podklasy, w kategorii, na przykład:
@interface XXDoctor (XXExtensions)
/**
@brief Needs manual KVO triggering as it is dependent on a collection.
Alternatively, you can observe insertions and deletions of the appointments, and trigger KVO on this propertyOtherwise it can be auto-
@return the latest of the to-many appointments relation.
**/
@property (readonly) XXAppointment *latestAppointment; // defined as the
@end
Realizacja:
#import "XXDoctor".h"
#import "XXAppointment.h"
@implementation XXDoctor (XXExtensions)
// this won't work because "appointments" is a to-many relation.
//+ (NSSet *)keyPathsForValuesAffectingLatestAppointment {
// return [NSSet setWithObjects:@"appointments", nil];
//}
- (XXAppointment *) latestAppointment {
NSInteger latestAppointmentIndex = [self.appointments indexOfObjectPassingTest:^BOOL(XXAppointment *appointment, NSUInteger idx, BOOL *stop) {
*stop = (appointment.dateFinished == nil);
return *stop;
}];
return (latestAppointmentIndex == NSNotFound) ? nil : [self.appointments objectAtIndex: latestAppointmentIndex];
}
@end
Przepraszam, ale tak naprawdę nie odpowiedziałeś na moje pytanie, jak poprawnie wdrożyć relacje przejściowe. Nie byłem w stanie znaleźć wiele na ten temat w dokumentach Apple. Czy masz link do tego konkretnego tematu? – batkuip
Zrobiłem. NIE POTRZEBUJESZ IMPLEMENTACJI. Tylko zaznacz znacznik jako "przejściowy", ponownie generuj podklasę NSManagedObject i używaj, jak chcesz. Brak dalszej implementacji. Obecnie z powodzeniem stosuję w aplikacji jedno i do wielu przejściowych relacji bez żadnego specjalnego problemu. –
Ah, W mojej aplikacji określiłem również relacje odwrotne do moich przejściowych relacji i ustawiłem je również jako przejściowe. Powodem, dla którego użyłem relacji przejściowych w mojej aplikacji (w przeciwieństwie do moich sugerowanych właściwości obliczonych) jest to, że UndoManager traktuje je jak zwykłe zmiany w CoreData i wie, jak je z wdziękiem odwrócić. –
całkiem pewny nie ma wsparcia dla przejściowych relacji po wyjęciu z pudełka, będziesz musiał wprowadzić je ręcznie. Może to nie odpowiedzieć bezpośrednio na twoje pytanie, ale najprostszym sposobem na wdrożenie relacji 'mostRecentApointpoint 'jest utworzenie metody w klasie warstwy dostępu do danych i pobranie jej za pomocą' NSFetchRequest' z predykatem deskryptora daty – Eugene
Hmm. Projektant pozwala na oznaczenie relacji jako przejściowej. Wygląda więc na to, że coś tam jest. Chciałbym skorzystać z KVO i buforowania, które są z nim związane, ponieważ nie chcę wykonywać żądań pobierania za każdym razem, gdy uzyskuję dostęp do obiektu. Mając nadzieję, że jest coś podobnego jak normalne właściwości przejściowe. – batkuip
Hi. Czy rozwiązałeś problem? Próbuję rozwiązać [powiązany problem] (http://stackoverflow.com/questions/42812151/core-data-fetch-w-predicate-of-transient-relationship-nil) Wydaje się, że przejściowy związek nie działa tak jak spodziewany. – LShi