szybko ułożyła model dla Ciebie:
Więc w zasadzie "Osoba" to osoba, która ma związek "Zwierzęta" - to „do wiele "relacji. Jedna osoba może mieć wiele zwierząt.
Następnie znajduje się obiekt "Zwierzę domowe". Jest to abstrakcyjny byt reprezentujący dowolne zwierzę domowe, koty i psy. Ma odwrotny związek ze "zwierzętami" z "Osoby". Dlatego od każdego zwierzaka można zawsze wrócić do odpowiedniego właściciela. Ponadto, każda podklasa "Pet" będzie miała pewne wspólne cechy, takie jak wiek/nazwa/waga.
Dodatkowo, podklasy (obiekty, które mają "Zwierzę" jako "Podmiot Macierzysty", takie jak "Pies" i "Kot") mogą mieć własne atrybuty oprócz atrybutów "Zwierzę", jak "Pies" ma "KoraSound", a "Cat" ma "meowSound".
Możesz oczywiście dodać dowolną liczbę osób do swojego magazynu, co nie ma nic wspólnego z modelem danych.
Aby pobrać informacje, po prostu użyj żądania pobierania, aby pobrać wszystkie osoby. Następnie przeprowadź przez nie pętle i uzyskaj dostęp do ich "zwierząt domowych", aby uzyskać NSSets dla swoich zwierząt. Możesz przechodzić przez te zestawy, aby uzyskać dostęp do informacji o zwierzętach.
Oto przykład, jak pobrać wszystkie osoby, a następnie wszystkie zwierzęta:
// Fetch all persons
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:yourContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [yourContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle error case
}
[fetchRequest release];
// Loop through all their pets
for (Person* person in fetchedObjects)
{
NSLog(@"Hello, my name is %@", person.name);
for (Pet* pet in person.pets) {
if ([pet isKindOfClass:[Dog class]])
{
NSLog(@"Woof, I'm %@, owned by %@", pet.name, pet.owner.name);
}
else
{
NSLog(@"Meow, I'm %@, owned by %@", pet.name, pet.owner.name);
}
}
}
Pamiętaj, że możesz także po prostu sprowadzić zwierzęta, bez przechodzenia przez ich właścicieli:
// Fetch all persons
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet" inManagedObjectContext:yourContext];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesSubentities:YES]; // State that you want Cats and Dogs, not just Pets.
NSError *error = nil;
NSArray *fetchedObjects = [yourContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle error case
}
[fetchRequest release];
The Powyższy kod nie jest testowany i może zawierać literówki, ale da ci pomysł, jak to zrobić.
W tym modelu byłoby ważne, czy pies czy kot nie miał atrybutów? – Vikings
Nie, to nie miało znaczenia. Właśnie dodałem atrybuty, aby pokazać, że mogą mieć atrybuty. Jeśli jednak nigdy nie będą miały atrybutów, możesz po prostu dodać łańcuch znaków lub wyliczenie do "Pet". Jeśli jednak mogą mieć atrybuty w przyszłości, trzymaj się ich pod-podmiotami. – JiaYow
Czy każda jednostka potrzebuje podklasy NSManagedObject? – Vikings