2011-10-24 13 views
5

Sto lavorando con le nuove funzionalità di UIDocument in iOS 5.0. Ho un'applicazione esistente che utilizza più modelli di dati diversi (file momd). Secondo la documentazione di UIManagedDocument, è possibile sovrascrivere - (NSManagedObjectModel *) managedObjectModel per caricare un modello dati specifico (l'impostazione predefinita è caricare tutti i modelli di dati trovati uniti). Entrambi i modelli di dati hanno nomi di modelli sovrapposti con schemi diversi, quindi nel mio caso questo non è auspicabile.Override managedObjectModel in UIManagedDocument

Relevant Apple Doc

Quindi, il problema che ho qui in un campione semplice, è che posso ignorare la funzione, ma non posso assegnarlo è risultato. È sia privato, quindi _managedObjectModel non è accessibile dalla sottoclasse; e, è di sola lettura, quindi self.managedObjectModel non può essere assegnato ..

Ho cercato un esempio UIManagedDocument che sovrascriva managedObjectModel, ma Apple non sembra fornirne uno.

Posso essere in grado di definire una nuova variabile di istanza _myManagedObjectModel e assegnarlo. Quindi restituiscilo sull'accessorio che sto ignorando. La mia preoccupazione è che si possa rompere qualche implementazione interna di UIManagedDocument che non usa l'accessorio managedObjectModel in preferenza per _managedObjectModel (che è spesso visto nelle implementazioni di Apple ...)

Sembra un problema semplice e sospetto che io sia Mi manca solo qualcosa di veramente semplice per consentire un corretto override.

// 
// DTNoteDocument.m 
// document-test 
// 
// 

#import "DTNoteDocument.h" 

@implementation DTNoteDocument 

NSString * const kDataManagerModelName = @"Note"; 

-(NSManagedObjectModel*)managedObjectModel { 

    if (_managedObjectModel != nil) 
     return _managedObjectModel; 

    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; // compile error on this line, private variable cannot be assigned 

    return _managedObjectModel; 
} 
@end 

Intestazione:

#import <UIKit/UIKit.h> 

@interface DTNoteDocument : UIManagedDocument 

@end 

risposta

5

ho risolto questa ultima settimana, ma Ho pensato di aggiornare in modo da riflettere la mia soluzione. Se trovi qualcosa di meglio, sarei felice di vederlo.

ho aggiunto una proprietà unica per la mia intestazione di classe per le partenze:

@property (nonatomic,retain,readonly) NSManagedObjectModel *myManagedObjectModel; 

quindi aggiunto il seguente alla mia implementazione della classe:

-(NSManagedObjectModel*)myManagedObjectModel { 
    if (myManagedObjectModel) 
     return myManagedObjectModel; 

    NSBundle *bundle = [NSBundle mainBundle]; 
    NSString *modelPath = [bundle pathForResource:kDataManagerModelName ofType:@"momd"]; 
    myManagedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:modelPath]]; 

    return myManagedObjectModel; 
} 

-(NSManagedObjectModel*)managedObjectModel { 
    return self.myManagedObjectModel; 
} 

Dal momento posso ignorare la proprietà ottenere per il managedObjectModel, questo funziona abbastanza bene. UIManagedDocument inizializza e funziona correttamente nei miei test e implementazioni fino ad ora. Facendo una traccia si mostra che managedObjectModel viene chiamato su init, quindi presumo che tutto sia inizializzato correttamente dal risultato restituito.

0

Finalmente ho scoperto il mio problema con la soluzione. L'UIManagedDocument dovrebbe consentire di modificare le opzioni objectmodelLoading ...

Ti manca nel codice questo:

di file .m

#import <CoreData/CoreData.h> 

@implementation DTNoteDocument{ 
    NSManagedObjectModel * myManagedObjectModel; 
}