2012-03-09 18 views
5

Mam problemy z tworzeniem i zrozumieniem sposobu tworzenia podstawowego modelu danych dla tej sytuacji.Relacja danych rdzenia iPhone

(1) Osoba może mieć wiele zwierząt (kombinację psa lub kota).

(2) Może być też wiele osób.

Chcę przejść przez jednostkę Osoby i pociągnąć każdą osobę, a także każdego zwierzaka i tam informacje.

Nie jestem pewien, czy powinienem użyć relacji, lub jak ustawić ten model w Core Data. Szybko zapisałem próbkę tego, co myślałem, że model będzie wyglądał. Zrobiłem ten model ze względu na prostotę, mój model nie dotyczy kotów i psów.

Wszelkie sugestie i pomysły są bardzo mile widziane.

enter image description here

Odpowiedz

11

szybko ułożyła model dla Ciebie:

enter image description here

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ć.

+0

W tym modelu byłoby ważne, czy pies czy kot nie miał atrybutów? – Vikings

+0

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

+0

Czy każda jednostka potrzebuje podklasy NSManagedObject? – Vikings

Powiązane problemy