How to Create a Class(es) for storing multi-level data?
I need to store multi-level data for a flash card app I'm writing and I could use some help figuring out 1) How to manage the data and 2) How to store it.

The data is broken down like this:
a) Card contains 2 strings
b) Pack contains a String "PackName" and an array of Cards
c) Deck contains a String "DeckName" and an array of Packs

Right now I have 3 Classes: Card, Pack, Deck.

    //Card.h
    @interface Card : NSObject {
        NSString        *primaryPhrase;
        NSString        *secondaryPhrase;
    }
    @property (nonatomic,retain)NSString        *primaryPhrase;
    @property (nonatomic,retain)NSString        *secondaryPhrase;
    @end


    Card.m
    @implementation Card
    @synthesize primaryPhrase;
    @synthesize secondaryPhrase;
    -(id)init{
        if(self=[super init]){
        }
        return self;
    }
    @end

    Pack.h
    @interface Pack : NSObject{
        NSString        *packName;
        NSMutableArray  *cards; //array of card classes
        BOOL            isInUse;
    }
    @property (nonatomic,retain)NSMutableArray  *cards;
    @property (nonatomic,retain)NSString        *packName;
    @property (nonatomic,assign)BOOL            isInUse;
    @end

    Pack.m
    @implementation Pack
    @synthesize packName;
    @synthesize cards;
    @synthesize isInUse;
    -(id)init{
        if(self=[super init]){
            self.isInUse=YES;
        }
        return self;
    }
    @end

    Deck.h
    @interface Deck : NSObject <NSCoding>{
        NSString        *deckName;
        NSMutableArray  *packs; //array of pack classes
        NSString        *primaryLang;
        NSString        *secondaryLang;
    }
    @property (nonatomic,retain)NSMutableArray  *packs;
    @property (nonatomic,retain)NSString        *deckName;
    @property (nonatomic,retain)NSString        *primaryLang;
    @property (nonatomic,retain)NSString        *secondaryLang;
    
    - (void) encodeWithCoder:(NSCoder*)encoder;
    - (id) initWithCoder:(NSCoder*)decoder;
    @end
    
    Deck.m
    #import "Deck.h"
    @implementation Deck
    @synthesize packs;
    @synthesize deckName;
    @synthesize primaryLang;
    @synthesize secondaryLang;
    
    //Default settings for each new Deck
    -(id)init{
        if(self=[super init]){
        }
        return self;
    }
    -(void)encodeWithCoder:(NSCoder*)encoder{
        [encoder encodeObject:packs forKey:@"packs"];
        [encoder encodeObject:deckName forKey:@"deckName"];
        [encoder encodeObject:primaryLang forKey:@"primaryLang"];
        [encoder encodeObject:secondaryLang forKey:@"secondaryLang"];
    }
    -(id)initWithCoder:(NSCoder*)decoder{
        if(self=[super init]){
            packs=[decoder decodeObjectForKey:@"packs"];
            deckName=[decoder decodeObjectForKey:@"deckName"];
            primaryLang=[decoder decodeObjectForKey:@"primaryLang"];
            secondaryLang=[decoder decodeObjectForKey:@"secondaryLang"];
        }
        return self;
    }
    @end


Then I use an NSMutableArray "allDecks" to hold Decks, which in turn contain Cards.

I end up with statements like this which don't even get to the card level:

    myLabel.text=((Pack *)[((Deck *)[allDecks objectAtIndex:0]).packs objectAtIndex:0]).packName;

It's pretty cumbersome to work the structure. 
Is this the best way to manage this data?

Plus, the encoding doesn't seem to save the embedded arrays (Pack and Card).
How to Create a Class(es) for storing multi-level data?
===

I need to store multi-level data for a flash card app I'm writing and I could use some help figuring out 1) How to manage the data and 2) How to store it.

The data is broken down like this:
a) Card contains 2 strings
b) Pack contains a String "PackName" and an array of Cards
c) Deck contains a String "DeckName" and an array of Packs

Right now I have 3 Classes: Card, Pack, Deck.

    //Card.h
    @interface Card : NSObject {
        NSString        *primaryPhrase;
        NSString        *secondaryPhrase;
    }
    @property (nonatomic,retain)NSString        *primaryPhrase;
    @property (nonatomic,retain)NSString        *secondaryPhrase;
    @end


    Card.m
    @implementation Card
    @synthesize primaryPhrase;
    @synthesize secondaryPhrase;
    -(id)init{
        if(self=[super init]){
        }
        return self;
    }
    @end

    Pack.h
    @interface Pack : NSObject{
        NSString        *packName;
        NSMutableArray  *cards; //array of card classes
        BOOL            isInUse;
    }
    @property (nonatomic,retain)NSMutableArray  *cards;
    @property (nonatomic,retain)NSString        *packName;
    @property (nonatomic,assign)BOOL            isInUse;
    @end

    Pack.m
    @implementation Pack
    @synthesize packName;
    @synthesize cards;
    @synthesize isInUse;
    -(id)init{
        if(self=[super init]){
            self.isInUse=YES;
        }
        return self;
    }
    @end

    Deck.h
    @interface Deck : NSObject <NSCoding>{
        NSString        *deckName;
        NSMutableArray  *packs; //array of pack classes
        NSString        *primaryLang;
        NSString        *secondaryLang;
    }
    @property (nonatomic,retain)NSMutableArray  *packs;
    @property (nonatomic,retain)NSString        *deckName;
    @property (nonatomic,retain)NSString        *primaryLang;
    @property (nonatomic,retain)NSString        *secondaryLang;
    
    - (void) encodeWithCoder:(NSCoder*)encoder;
    - (id) initWithCoder:(NSCoder*)decoder;
    @end
    
    Deck.m
    #import "Deck.h"
    @implementation Deck
    @synthesize packs;
    @synthesize deckName;
    @synthesize primaryLang;
    @synthesize secondaryLang;
    
    //Default settings for each new Deck
    -(id)init{
        if(self=[super init]){
        }
        return self;
    }
    -(void)encodeWithCoder:(NSCoder*)encoder{
        [encoder encodeObject:packs forKey:@"packs"];
        [encoder encodeObject:deckName forKey:@"deckName"];
        [encoder encodeObject:primaryLang forKey:@"primaryLang"];
        [encoder encodeObject:secondaryLang forKey:@"secondaryLang"];
    }
    -(id)initWithCoder:(NSCoder*)decoder{
        if(self=[super init]){
            packs=[decoder decodeObjectForKey:@"packs"];
            deckName=[decoder decodeObjectForKey:@"deckName"];
            primaryLang=[decoder decodeObjectForKey:@"primaryLang"];
            secondaryLang=[decoder decodeObjectForKey:@"secondaryLang"];
        }
        return self;
    }
    @end


Then I use an NSMutableArray "allDecks" to hold Decks, which in turn contain Cards.

I end up with statements like this which don't even get to the card level:

    myLabel.text=((Pack *)[((Deck *)[allDecks objectAtIndex:0]).packs objectAtIndex:0]).packName;

It's pretty cumbersome to work the structure. 
Is this the best way to manage this data?

Plus, the encoding doesn't seem to save the embedded arrays (Pack and Card).