2011-10-24 13 views
5

Pracuję z nowymi funkcjami UID w systemie iOS 5.0. Mam istniejącą aplikację, która używa wielu różnych modeli danych (pliki momd). Zgodnie z dokumentacją dla UIManagedDocument można przesłonić - (NSManagedObjectModel *) managedObjectModel, aby załadować określony model danych (domyślnie ładowane są wszystkie znalezione modele danych połączone). Oba modele danych mają nakładające się nazwy modeli z różnymi schematami, więc nie jest to pożądane w moim przypadku.Zastąp obiekt managedObjectModel w UIManagedDocument

Relevant Apple Doc

Tak, problem mam tutaj w prosty próbce, jest to, że mogę zastąpić funkcję, ale nie mogę przypisać to wynik. Jest on zarówno prywatny, więc klasa _managedObjectModel nie może być dostępna dla podklasy; i, jest on tylko do odczytu, więc self.managedObjectModel nie może zostać przypisany ..

Szukałem przykładu UIManagedDocument, który zastępuje managedObjectModel, ale Apple nie wydaje się go udostępniać.

Mogę być w stanie zdefiniować nową zmienną instancji _myManagedObjectModel i przypisać ją. Następnie zwróć to na akcesorium, nadpisuję. Obawiam się, że może dojść do przerwania wewnętrznej implementacji dokumentu UIManagedDocument, który nie używa akcesora managedObjectModel, a nie _managedObjectModel (który jest często widywany w implementacjach Jabłek).

Wydaje się, że jest to prosty problem i podejrzewam, że " Właśnie przegapiłem coś naprawdę prostego, aby umożliwić właściwe przesłonięcie.

// 
// 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 

Header:

#import <UIKit/UIKit.h> 

@interface DTNoteDocument : UIManagedDocument 

@end 

Odpowiedz

5

Rozwiązałem to w zeszłym tygodniu, ale pomyślałam, że mogę zaktualizować odzwierciedlać moje rozwiązanie. Jeśli znajdziesz coś lepszego, byłbym szczęśliwy widząc to.

dodałem unikalną właściwość do mojej klasy nagłówka do startów:

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

Następnie dodaje następujące do mojego implementacji klasy:

-(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; 
} 

Ponieważ mogę zastąpić właściwość dostać za managedObjectModel, to działa całkiem dobrze. UIManagedDocument inicjuje i działa dobrze w moich testach i implementacjach do tej pory. Wykonywanie śledzenia pokazuje, że obiekt managedObjectModel został wywołany przy uruchamianiu init, więc zakładam, że wszystko jest poprawnie zainicjowane na podstawie zwróconego wyniku.

0

W końcu dowiedziałem się o moim problemie z rozwiązaniem. UIManagedDocument powinno pozwolić nam na zmianę opcji objectmodelLoading ...

Brakuje w kodzie to:

.M plik

#import <CoreData/CoreData.h> 

@implementation DTNoteDocument{ 
    NSManagedObjectModel * myManagedObjectModel; 
}